【问题标题】:Struggling with R environments and evaluating expressions在 R 环境中挣扎并评估表达式
【发布时间】:2021-07-20 17:35:26
【问题描述】:

我需要解析和评估函数内的表达式。如果我做 来自原始函数 'eval' 和 'parse' 的两个任务,解释 似乎工作正常:

ff0 <- function() {
  aaa <- 5
  ss <- "aaa"
  print(eval(parse(text = ss)))
}

> ff0()
[1] 5

但是,如果我尝试将这两个函数封装成一个函数, 如下:

evalstr <- function(s, ...) eval(parse(text=s), ...)

ff1 <- function() {
  aaa <- 5
  ss <- "aaa"
  print(evalstr(ss))
}

> ff1()
 Error in eval(parse(text = s), ...) : 'aaa' object not found 

代码未按预期工作。我认为应该将环境传递给“eval”,但我不知道是哪个。

【问题讨论】:

  • 也许指定envir。另外,您可以使用get

标签: r


【解决方案1】:

您也可以使用以下解决方案。我删除了...,因为我不明白你在哪里试图用它传递给eval

library(rlang)

evalstr <- function(s) eval_tidy(parse_expr(s), env = caller_env())

ff1 <- function() {
  aaa <- 5
  ss <- "aaa"
  print(evalstr(ss))
}

ff1()
[1] 5

【讨论】:

    【解决方案2】:

    指定envir。这会更紧凑get

    ff0 <- function() {
      aaa <- 5
      ss <- "aaa"
      print(get(ss))
    }
    
    ff0()
    [1] 5
    evalstr <- function(s, envir = parent.frame()) get(s, envir = envir)
    
    ff1 <- function() {
      aaa <- 5
      ss <- "aaa"
      print(evalstr(ss))
    }
    ff1()
    [1] 5
    

    【讨论】:

      【解决方案3】:

      由于目标表达式不像发布的那么简单,我正在修改 ff0、ff1 函数并根据 [https://stackoverflow.com/users/3732271/akrun 发布的表达式给出答案][1]:

      ff0 <- function() {
        aaa <- 5
        bbb <- 4
        ss <- "aaa+bbb"
        print(eval(parse(text = ss)))
      }
      
      evalstr <- function(s, ...) eval(parse(text=s), envir = parent.frame(), ...)
      
      ff1 <- function() {
        aaa <- 5
        bbb <- 4
        ss <- "aaa+bbb"
        print(evalstr(ss))
      }
      

      在这种情况下,'get' 不起作用。

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        • 2019-09-26
        • 2017-05-05
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多