我正在尝试创建一个接收数据帧并添加一个新变量的函数,该变量是输入数据帧的名称。例如:
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中的函数有一个基本的误解?
答案 0 :(得分:2)
使用lazyeval
可能有更好的单行方式来实现这一目标,但这似乎有效
add_id <- function(x) {
s <- as.character(substitute(x))
mutate(x, id = s)
}
add_id(foo)
(与您尝试做的相比,您必须在s
来电之外评估mutate