如果 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 了解一些原因。
使用 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 了解一些原因。