将条件作为函数参数传递

时间:2016-12-19 19:35:20

标签: r

有没有办法将条件作为参数传递?例如:

#g is some data'

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

然后能够传递条件本身,例如打电话给getIndexesWhen('GDP','> 435')。或者我是否需要为每种情况分别设置功能,例如: =,!=,&gt;,&lt;等等?

3 个答案:

答案 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")