如果VAR_NAME为数字,如何评估(解析(text = var_name),envir = df)?
使用评估我用变量制作不同的东西。这是一个示例,简单地将变量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&lt; - df $ a;
。另一方面,第二个示例与返回3
的键入[1] 3
相同。有没有办法清楚地表明,即使使用数字,我们也希望eart(...)
在envir
参数中寻找变量名称?
我想到的就是eval(parse(text =“ 3`”),envir = df),但是我需要一个解决方案,可以在其中提供vector var_name
的变量名称。
Using eval I make different stuff with variables. Here is an example where simply the variable a
is returned without any transformations:
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
This works as expected. But if I call a column name as a number, e.g. 3
, this does not return the expected vector 1:10
:
df <- data.frame(1:10); var_name <- "3"
names(df) <- var_name
eval(parse(text= var_name), envir= df)
[1] 3
I understand that in first example I get the expected output because eval(...)
is same as saving a
as a variable in the global environment and then calling it, i.e. a <- df$a; a
. On the other hand, the second example is same as typing 3
which returns [1] 3
. Is there a way to make clear that even with numbers we want eval(...)
to look for variable names in the envir
argument?
All I've come up with is eval(parse(text= "`3`"), envir= df) but I need a solution where I can provide the variable name with the vector var_name
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这里有几个选项。您可以将
var_name
包装在as.symbol
中,或者,可能更简单,您可以使用
get
代替:但请注意,将字符串作为对象传递解析为代码通常是不好的做法,无论您使用
get
还是eval
- 请参阅 此处有几个原因。There are a couple of options here. You could wrap
var_name
inas.symbol
Or, possibly simpler, you could use
get
instead:Note though that passing strings around as objects to be parsed into code is generally bad practice, whether you use
get
oreval
- see here for a few reasons why.