使用eval,我用变量制作不同的东西。这里有一个例子,简单地返回变量a
而不进行任何转换:
df <- data.frame(1:10); var_name <- "a"
names(df) <- var_name
eval(parse(text= var_name), envir= df)
[1] 1 2 3 4 5 6 7 8 9 10
这是意料之中的事。但是,如果我将列名称为数字,例如3
,则不会返回预期的向量1:10
:
df <- data.frame(1:10); var_name <- "3"
names(df) <- var_name
eval(parse(text= var_name), envir= df)
[1] 3
我知道,在第一个例子中,我得到了预期的输出,因为eval(...)
与将a
保存为全局环境中的变量,然后调用它(即a <- df$a; a
(相同。另一方面,第二个示例与键入返回[1] 3
的3
相同。有没有一种方法可以明确,即使使用数字,我们也希望eval(...)
在envir
参数中查找变量名?
我所想到的只是eval(parse(text="`3`"(,envir=df(,但我需要一个解决方案,可以用向量var_name
提供变量名。
这里有几个选项。您可以将var_name
包装在as.symbol
中
df <- data.frame(1:10); var_name <- "3"
names(df) <- var_name
eval(as.symbol(var_name), envir = df)
#> [1] 1 2 3 4 5 6 7 8 9 10
或者,可能更简单,您可以使用get
来代替:
df <- data.frame(1:10); var_name <- "3"
names(df) <- var_name
get(var_name, envir = as.environment(df))
#> [1] 1 2 3 4 5 6 7 8 9 10
不过,请注意,无论您使用get
还是eval
,将字符串作为要解析到代码中的对象传递通常都是不好的做法——请参阅此处了解原因。