我有一个逻辑运算符和一个数值我想作为单个元素传递给函数中的一个语句(我听到数百个R用户呻吟;我从来没有这样做,但有一种情况我觉得没关系)。
DF <- mtcars
overlap = "> 2"
as.numeric(rowSums(DF[, 1:6]) overlap)
如何让第三行像:
as.numeric(rowSums(DF[, 1:6]) > 2)
我知道它可能是eval
和parse
,但从不使用它们,所以不要真正理解如何在这里使用它们。
答案 0 :(得分:7)
像
这样的东西Olap <- unlist(strsplit( overlap, " "))
Thresh <- as.numeric(Olap[2])
Comp <- match.fun(Olap[1])
Comp(rowSums(DF[,1:6]), Thresh)
另一种方法是按照你的建议使用eval和parse
What <- rowSums( DF[,1:6])
textcall <- sprintf(" What %s", overlap)
exprcall <- parse(text = textcall)
eval( exprcall)
答案 1 :(得分:7)
您必须将整个表达式转换为字符串,然后将解析后的文本转换为表达式。 最后,在表达式上调用eval()。
例如:
overlap <- "> 2"
# Convert to string
exprAsString <- paste0("as.numeric(rowSums(DF[, 1:6]) ", overlap, ")")
# Convert to expression, using parse
expr <- as.expression(parse(text=exprAsString))
# Then call eval()
eval(expr)
确认合理:
identical(eval(expr), as.numeric(rowSums(DF[, 1:6]) > 2))
# [1] TRUE
答案 2 :(得分:1)
令我感到震惊的是,虽然@mnel的解决方案很好,但这种情况可以通过在main函数中创建一个虚函数并使用输入字符串(overlap
)作为参数来解决。修改body(dummy_function)
。这可能会更清洁。