有没有办法将条件作为参数传递?例如:
#g is some data'
getIndexesWhen <- function (colname, condition) {
a <- as.vector(g[,colname])
a <- which(a fits condition)
}
然后能够传递条件本身,例如打电话给getIndexesWhen('GDP','> 435')
。或者我是否需要为每种情况分别设置功能,例如: =,!=,&gt;,&lt;等等?
答案 0 :(得分:4)
您可以将函数作为参数传递:
getIndexesWhen<-function(colname, condition)
{
a<-as.vector(g[,colname])
return(which(condition(a)))
}
getIndexesWhen("GDP", function(x)x>435)
答案 1 :(得分:3)
您可以将“大于”部分和“435”部分拆分为getIndexesWhen
函数的参数,而不是使用“大于435”的表达式或函数:
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
答案 2 :(得分:1)
因为您可以使用例如:
将字符串转换为可执行表达式eval(parse(text = "3 > 1"))
或者,使用例如:
的可执行表达式的字符串向量sapply(parse(text = paste0(3:4, "<4")), eval)
您可以在您的情况下利用此功能通过以下方式传递自由文本条件:
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")