r - deparse(substitute()) 正常返回函数名,但在 for 循环内部调用时返回函数代码

标签 r non-standard-evaluation

我对 R 在非常具体的情况下的行为感到有些惊讶。假设我定义了一个函数 square返回其参数的平方,如下所示:

square <- function(x) { return(x^2) }

我想在另一个函数中调用这个函数,我也想在我这样做的时候显示它的名字。我可以使用 deparse(substitute()) 做到这一点.但是,请考虑以下示例:
ds1 <- function(x) {
  print(deparse(substitute(x)))
}

ds1(square)
# [1] "square"

这是预期的输出,所以一切都很好。但是,如果我传递包装在列表中的函数并使用 for 循环处理它,则会发生以下情况:
ds2 <- function(x) {
  for (y in x) {
    print(deparse(substitute(y)))
  }
}

ds2(c(square))
# [1] "function (x) "   "{"               "    return(x^2)" "}"  

任何人都可以向我解释为什么会发生这种情况以及我如何防止它发生?

最佳答案

一旦您使用 x在您的函数中,它被评估,因此它“不再是(未评估的)表达式”并“开始成为其结果值(已评估的表达式)”。为了防止这种情况,您必须捕获 x来自 substitute在您第一次使用它之前。
substitute的结果是一个对象,您可以像查询列表一样对其进行查询。所以你可以使用

x <- substitute(x)

然后 x[[1]] (函数名称)和 x[[2]]并遵循(函数的参数)

所以这有效:
ds2 <- function(x) {
    x <- substitute(x)
    # you can do `x[[1]]` but you can't use the expression object x in a
    # for loop. So you have to turn it into a list first
    for (y in as.list(x)[-1]) {
        print(deparse(y))
    }
}
ds2(c(square,sum))
## [1] "square"
## [1] "sum"

关于r - deparse(substitute()) 正常返回函数名,但在 for 循环内部调用时返回函数代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47904321/

相关文章:

r - 如何使用批处理文件运行R语言(.r)文件?

r - 将额外参数传递给 ggplot2 geoms : using ellipsis (. ..)

r - 使用 geom_point() 恒定标签大小,同时使用可变点大小

重新排序图例项并在 R 中添加换行符

julia - Julia 有延迟设置吗? (相当于 := from Mathematica)

r - 使用 ggplot2 绘制饼图

r - 从可能的标签库中将标签分配给数据框

r - 如何在嵌套函数中将所有可能的内容传递给 i、j 和 by?

r - 我如何使用 coalesce row wise?