如果 var_name 是一个数字,如何 eval(parse(text= var_name), envir= df) ?

How to eval(parse(text= var_name), envir= df) if var_name is a number?

使用 eval 我用变量做了不同的东西。这是一个示例,其中变量 a 只是 returned,没有任何转换:

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,这不是 return 预期的向量 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。另一方面,第二个例子与键入 3 which returns [1] 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,将字符串作为要解析为代码的对象传递通常都是不好的做法 - 请参阅 here 了解一些原因。