r-如果var_name是一个数字,如何评估(parse(text=var_name),envir=df)



使用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] 33相同。有没有一种方法可以明确,即使使用数字,我们也希望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,将字符串作为要解析到代码中的对象传递通常都是不好的做法——请参阅此处了解原因。

最新更新