【问题标题】:How to evaluate an expression with variables in R?如何评估带有R中变量的表达式?
【发布时间】:2013-12-14 09:43:15
【问题描述】:

我希望这段代码设置 plt 等于 10:

> var = "plt"
> eval(paste0(var, "<-", 10))
[1] "plt<-10"

但是,它返回的是一个字符串。

我尝试了eval(as.expression(paste0(var, "&lt;-", 10))) 和其他选项,但仍然没有给出预期的结果。

代码有什么问题?

【问题讨论】:

  • 如果答案是 parse() 你通常应该重新考虑这个问题。 -- Thomas Lumley R-help(2005 年 2 月)
  • 你到底想做什么?
  • @Thomas 执行一个函数,其名称作为参数传递给另一个函数。喜欢function(type, ...) eval(parse(text=paste0("plt &lt;- ", type, "(...)"
  • @Anton 那样的话,请看罗兰的回答。
  • 通常传递函数名是一件非常非常糟糕的事情。而是传递 actual 函数。 foo("sqrt") 不好,因为您必须跳过各种障碍才能恢复功能。 foo(sqrt) 更好:foo=function(f){f(2)} 巧妙地应用传入的函数。

标签: r variables expression eval


【解决方案1】:

如果我正确理解您的评论,则没有理由潜入eval(parse()) 鲨鱼出没的水域。试试这样的:

myfun <- function(x, fun) {
  if (is.character(fun)) fun <- match.fun(fun)
  fun(x)
}

myfun(1:5, mean)
#[1] 3
myfun(1:5, "mean")
#[1] 3

【讨论】:

    【解决方案2】:

    请参阅:?parse。您的演示代码:

    > var = "plt"
    > eval(parse(text = paste0(var, "<-", 10)))
    > plt
    [1] 10
    

    更新:基于@Anton 关于最初目标的评论 - 怎么样:

    > f <- function(type, ...) {
    +     assign('plt', do.call(deparse(substitute(type)), list(...)), envir = .GlobalEnv)
    + }
    > f(mean, x = 1:20)
    > plt
    [1] 10.5
    

    PS:我仍在尝试实现 OP 所追求的东西,而不是他可能或应该追求的东西——这就是我在上面使用 assign.GlobalEnv 的原因,尽管顺便说一句,这不是一个好主意。

    【讨论】:

    • @Anton 说真的,不要使用这个。这将导致代码质量很差(难以理解和维护)。 eval(parse()) 总是有更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多