【问题标题】:What is an alternative to this eval parse code?这个 eval 解析代码的替代方法是什么?
【发布时间】:2020-01-04 00:29:44
【问题描述】:

我正在将一些代码插入到其他人的自定义 R 包中,但我无法灵活地按照自己的意愿编写它。

我需要能够按照我可以用公式重新创建的类似格式总结许多变量。

我正在寻找一种更有效的方式来编写这个。效率很重要,因为要处理大量数据。

这是显示我想要做什么的示例代码,但它很慢而且很笨重。我知道 eval-parse 不是最好的方法,这就是为什么我要求更好的方法:-)

v1 <- 1
v2 <- 2
v3 <- 3
v4 <- 4

# this for loop works, but it is clunky and slow
string <- character()
for (i in 1:4) {
  if (i < 4) string <- c(string, paste0("v",i,"+"))
  else string <- c(string, paste0("v",i))
}
eval(parse(text=string))

【问题讨论】:

  • 看起来像Reduce("+", mget(paste0("v", 1:4)))
  • 您在寻找this吗?
  • 1) 您不需要循环来形成字符串:paste0("v", 1:4, collapse = "+")。 2) @akrun 的Reduce 的替代品可以是Reduce("+", mget(ls(pattern = "^v\\d+$")))
  • akrun的回答很完美,谢谢!!
  • 感谢 d.b,当我有机会时,我将不得不对这些方法与 Reduce 解决方案进行基准测试

标签: r eval


【解决方案1】:

我们可以在获取list中的对象值后使用Reduce

Reduce(`+`, mget(paste0("v", 1:4)))

【讨论】:

    【解决方案2】:

    既然你说的是公式,也许reformulate()可以帮上忙

    reformulate(paste0("v",1:4))
    #> ~v1 + v2 + v3 + v4
    

    您可以使用以下方法获得预期的输出,但在这种情况下,它的效率和直观性不如@akrun 的方法:

    eval(reformulate(paste0("v",1:4))[[2]])
    #> [1] 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2012-03-05
      • 1970-01-01
      • 2010-10-31
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多