【问题标题】:Pass character argument and evaluate传递字符参数并评估
【发布时间】:2012-11-12 06:18:07
【问题描述】:

我有一个逻辑运算符和一个数值,我想将其作为单个元素传递给函数中的语句(我听到数百名 R 用户抱怨;我从不这样做,但有一种情况我觉得可以)。

DF <- mtcars
overlap = "> 2"
as.numeric(rowSums(DF[, 1:6]) overlap)

我怎样才能使第三行像这样工作:

as.numeric(rowSums(DF[, 1:6]) > 2)

我知道很可能是evalparse,但从不使用它们,所以不太了解如何在这里使用它们。

【问题讨论】:

  • 您能否将重叠作为包含比较和阈值的列表传递?
  • @mnel 不,因为重叠可能意味着更多的事情。它必须是字符输入。

标签: r


【解决方案1】:

有点像

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)

【讨论】:

  • 我认为您需要unlist,但这可能是我采取的方法。让我们看看智囊团还有什么。
  • 谢谢我一开始就对如何使用eval parse 非常感兴趣,它提供了很多信息,但我认为您建议的第一种方法可能会更好。 +1 我会稍微让人们做出回应,但我已经使用您的第一个建议设置了该功能。
  • 4 点赞,没有其他解决方案告诉我这是复选标记。我已经将函数上传到了 github。效果很好。谢谢你的想法。
  • 第二个选项目前不起作用。当你在电脑前时,请记得纠正它:-) 或者其他人可以吗?
  • @mb3041023 -- 第一个示例现已修复。第二个对我有用(不变)
【解决方案2】:

您必须将整个表达式转换为字符串,然后将解析后的文本转换为表达式。 最后,在表达式上调用 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

【讨论】:

    【解决方案3】:

    令我震惊的是,虽然 @mnel 的解决方案很好,但这种情况可以通过在主函数中创建一个虚拟函数并使用输入字符串 (overlap) 作为修改 @ 的参数来解决987654322@。这样会干净很多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多