2013-10-25 82 views
6

我對R很新,想知道函數是如何創建的。生成函數

說,如果我有:

> colourName 
[1] "red" "green" "blue" "yellow" "white" "black" 

#Which the following colours equal something like this: 
#red = 1 
#green = 2 
#blue = 3 
#yellow = 4 
#white = 5 
#black = 6 

如何創建一個名爲myColour()函數,其中返回結果作爲數字載體?

所以,如果我下面鍵入下面,我應該得到:

> myColour("yellow") 
[1] 4  

請幫助..

我的代碼(但它的錯!)

colourName<-c("red", "green", "blue", "yellow", "white", "black") 
data <- c(1,2,3,4,5,6) 

myFunction <- function(colour){ 
colourName = data 
return(colour) 
} 
myFunction("red") 

是否有可能我可以創建它作爲一種功能嗎?

+1

你能分享一下你到現在爲止所嘗試過的嗎? – TheComeOnMan

+0

對不起,因爲這是我第一次,我不知道。我已經加載了我的代碼,但其不正確.. – user2914874

+3

@Diego Jimeno我做了我的研究,我相信我有權提出問題。這對你來說可能很簡單,但我只用了3天的時間。 – user2914874

回答

1

我想在這裏你的困難是,你並不需要的功能,而你需要一個名爲向量

您可以建立一個向量爲您舉例如下。可能有更快的方式做到這一點,但我希望這種方式是明確的:

colourName=c("red","green","blue","yellow","white","black") 
# Initialise a vector of numbers 
colours=1:length(colourName) 
# Name the vector elements according to the number-name relationship you're after 
names(colours)=colourName 
# See what the vector looks like 
colours 
# Try it out 
colours["yellow"] 
colours[["yellow"]] 

UPDATE:矢量化給予相同的效率水平從@ SimonO101的答案。請注意,此解決方案(和來自@ SimonO101的第二個解決方案)不需要您定義函數。

+1

這是如何添加@ SimonO101的答案之外的任何內容? – Thomas

+0

你可以用'setNames(seq_along(colourName),colourName)'清理一下。 – hadley

+0

@hadley *正是*我的答案。 –

6

你可以在一個名爲向量,它可以有效地做像這樣查找你的顏色(S)...

x <- setNames(seq_along(colourName) , colourName) 
#red green blue yellow white black 
# 1  2  3  4  5  6 

x[ 'red' ] 
#red 
# 1 

使用功能在這裏似乎並不像一個偉大的事,但如果你願意,你可以有一個簡單的查找功能這樣的,這需要顏色的矢量和查找值(但你可能也只是使用which !!)......

myFunction <- function(colours , x){ 
    y <- which(colours %in% x) 
    if(length(y) == 0L) 
    y <- "Colour not found" 
    return(y) 
} 

myFunction(colourName , "red") 
[1] 1 

# Using R's inbuilt colour names 
myFunction(colours() , "purple") 
[1] 547 
0
somevector <- c("red","blue","green") 
datavector <- c(1,2,3) 
mycolour <- function(whichcolour) 
{ 
    grep(x = somevector, pattern = whichcolour) 
} 

輸出 -

> datavector[mycolour("green")] 
[1] 3 
5

這就是爲什麼你的代碼是錯誤的,它做什麼:

colourName<-c("red", "green", "blue", "yellow", "white", "black") 
data <- c(1,2,3,4,5,6) 

,設置兩個變量與這些價值觀的載體。

myFunction <- function(colour){ 

開始用一個參數定義一個新功能,colour

colourName = data 

創建另一個名爲colourName新的變量,(單=符號是一樣的< - 符號),並賦予它的data值。這個colourName變量只在函數內部可見。因此,現在您的函數中有一個colourName變量,其值爲c(1,2,3,4,5,6),因爲它的函數外部是data的副本。

return(colour) 
} 

這返回作爲該函數結果的值colour。由於這與myFunction <- function(colour){中的參數相同,因此您尚未更改colour變量,因此您只需回到您放入的內容即可!

myFunction("red") 

這調用該函數,參數colour的值設置爲"red"。現在查看功能代碼,然後您應該看到它將打印[1] "red" - 與輸入相同的矢量。

我知道這並不完全回答你如何獲得你想要的顏色數量的問題,但你顯然沒有理解很多編程的基礎知識,所以我希望這會有所幫助。

+3

+1這是答案應該是。徹底和有益的解釋。 –