我有一个逻辑运算符和一个数值,我想将其作为单个元素传递给函数中的语句(我听到数百名 R 用户在抱怨;我从不这样做,但有一种情况我觉得可以)。
DF <- mtcars
overlap = "> 2"
as.numeric(rowSums(DF[, 1:6]) overlap)
我怎样才能使第三行像这样工作:
as.numeric(rowSums(DF[, 1:6]) > 2)
我知道这很可能eval
,parse
但从不使用它们,所以不太了解如何在这里使用它们。
我有一个逻辑运算符和一个数值,我想将其作为单个元素传递给函数中的语句(我听到数百名 R 用户在抱怨;我从不这样做,但有一种情况我觉得可以)。
DF <- mtcars
overlap = "> 2"
as.numeric(rowSums(DF[, 1:6]) overlap)
我怎样才能使第三行像这样工作:
as.numeric(rowSums(DF[, 1:6]) > 2)
我知道这很可能eval
,parse
但从不使用它们,所以不太了解如何在这里使用它们。
就像是
Olap <- unlist(strsplit( overlap, " "))
Thresh <- as.numeric(Olap[2])
Comp <- match.fun(Olap[1])
Comp(rowSums(DF[,1:6]), Thresh)
另一种方法是 eval 并按照您的建议进行解析
What <- rowSums( DF[,1:6])
textcall <- sprintf(" What %s", overlap)
exprcall <- parse(text = textcall)
eval( exprcall)
您必须将整个表达式转换为字符串,然后将解析后的文本转换为表达式。最后,在表达式上调用 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
令我震惊的是,虽然 @mnel 的解决方案很好,但这种情况可以通过在主函数中创建一个虚拟函数并使用输入字符串 ( overlap
) 作为 modify 的参数来解决body(dummy_function)
。那可能会干净得多。