2016-12-19 62 views
6

有沒有辦法將條件作爲參數傳遞?例如:作爲函數參數傳遞一個條件

#g is some data' 

getIndexesWhen <- function (colname, condition) { 
    a <- as.vector(g[,colname]) 
    a <- which(a fits condition) 
} 

,然後可以在條件本身,例如通過打電話像getIndexesWhen('GDP','> 435')。或者我需要爲每種情況分別具有不同的功能,例如=,!=,>,<等?

+3

您可以傳遞函數(返回布爾值或boolea n向量)作爲參數。 – user31264

回答

3

而不是使用表達式或函數「大於435」,你可以在「大於」部分和「435」的一部分作爲參數分頭您getIndexesWhen功能:

getIndexesWhen <- function(colname, fxn, rhs) { 
    which(fxn(as.vector(g[,colname]), rhs)) 
} 

現在你可以得到你想要的功能,而不需要聲明一個用戶定義的函數爲每個函數/右手側配對:

g <- iris 
getIndexesWhen("Petal.Width", `<`, 0.2) 
# [1] 10 13 14 33 38 
getIndexesWhen("Petal.Length", `==`, 1.5) 
# [1] 4 8 10 11 16 20 22 28 32 33 35 40 49 
3

您可以傳遞函數作爲參數:

getIndexesWhen<-function(colname, condition) 
{ 
    a<-as.vector(g[,colname]) 
    return(which(condition(a))) 
} 

getIndexesWhen("GDP", function(x)x>435) 
1

既然你可以使用如字符串轉換爲可執行的表達,:

​​

或者,可執行表達式的字符串使用矢量例如:

sapply(parse(text = paste0(3:4, "<4")), eval) 

你可以利用這個在你的情況下通過一個f稀土元素文本條件,通過使用:

getIndexesWhen<-function(g, colname, condition) 
{ 
    a <- as.vector(g[,colname]) 
    which(sapply(parse(text = paste0(a, condition)), eval)) 
} 

此評估針對所提供的條件的列向量。

g <- data.frame(C1 = c(2, 3, 4)) 
getIndexesWhen(g, "C1", ">=3")