如果VAR_NAME为数字,如何评估(解析(text = var_name),envir = df)?

发布于 2025-01-17 13:20:23 字数 811 浏览 1 评论 0原文

使用评估我用变量制作不同的东西。这是一个示例,简单地将变量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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

撩心不撩汉 2025-01-24 13:20:23

这里有几个选项。您可以将 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 - 请参阅 此处有几个原因。

There are a couple of options here. You could wrap var_name in 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

Or, possibly simpler, you could use get instead:

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

Note though that passing strings around as objects to be parsed into code is generally bad practice, whether you use get or eval - see here for a few reasons why.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文