【问题标题】:R: Turn Input Variable to String - `deparse(substitute(x))` not workingR:将输入变量转换为字符串 - `deparse(substitute(x))` 不起作用
【发布时间】:2015-06-16 08:12:13
【问题描述】:

我正在尝试创建一个函数,该函数接受一个数据框并添加一个新变量,该变量是输入数据框的名称。例如:

foo <- data.frame(x = 1:10, y = rep(c("a", "b")))
mutate(foo, id = "foo") 

这似乎相对容易完成,因为它在这里工作:

var_as_string <- function(x) {deparse(substitute(x))}

var_as_string(foo)

Result:
[1] "foo"

我也想过这样,但事实并非如此:

add_id <- function(x) {
    mutate(x, id = deparse(substitute(x)))
}

add_id(foo)

Result:
   zz yy id
1   1  a  x
2   2  b  x
3   3  a  x
4   4  b  x
5   5  a  x
6   6  b  x
7   7  a  x
8   8  b  x
9   9  a  x
10 10  b  x

作为测试,我尝试了这个,但它也没有像我想象的那样工作:

var_as_string2 <- function(x) {
  var_string <- var_as_string(x)
  var_string(x)
}

var_as_string2(foo)

Result:
[1] "x"

有解决办法吗?我是否在这里忽略了某些东西,或者我对 R 中的函数有根本的误解?

【问题讨论】:

  • mutate 可以来自dplyr 或plyr。我假设你想要一个基于dplyr的解决方案?
  • 抱歉,我使用的是plyr...mutate 部分工作正常,当在内部使用deparse(substitute(x)) 时,变量名没有被分配为id定义函数
  • 通过创建与@konvas 的函数相同的方式,deparse(substitute( 为我工作。但是,我使用的是dplyr。即add_id &lt;- function(x) {s &lt;- deparse(substitute(x)); mutate(x, id = s)}

标签: r


【解决方案1】:

使用lazyeval 可能有更好的单行方式来实现这一点,但这似乎可行

add_id <- function(x) {
    s <- as.character(substitute(x))
    mutate(x, id = s)
}

add_id(foo)

(与您尝试做的相比,您必须在 mutate 调用之外评估 s)

【讨论】:

  • @akrun 好点,如果 OP 使用 plyr,如 cmets 中所述,最好坚持使用 substitute
  • @akrun lazyeval 是为/与 dplyr 一起设计的,但在处理未评估的参数时,它基本上是substitute 的通用替代品。
  • @Konrad:我尝试使用lazyeval - add_id_lazy &lt;- function(x) { mutate(x, id = interp(~name, name = as.character(substitute(x)))) } 但这不起作用...知道为什么吗?
  • @Dixon11111 f = function (x) eval(interp(quote(mutate(x, id = y)), y = deparse(substitute(x)))) — 关键是您使用interp 将未计算的参数名称注入mutate 表达式,然后对其进行计算。或者,这是一个没有lazyeval 的更简单的解决方案(bquote 可以很好地代替interp):f = function (x) eval(bquote(mutate(x, id = .(deparse(substitute(x))))))
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多