R base::带变量的选项
我注意到R的base::options()中有一些我无法完全理解的行为。
以下情况很好:
> vals_vector
[1] "temp" "hum" "co2" "voc" "pm1" "pm2_5" "pm10"
> options("hum" = TRUE)
> if (getOption("hum")) {
+ print("stuff")
+ }
[1] "stuff"
这也很好:
> options(TEMP_ENABLE = "temp" %in% vals_vector)
> getOption("TEMP_ENABLE")
[1] TRUE
但是,以下操作不起作用。
> options(as.character(vals_vector[1]) = TRUE)
Error: unexpected '=' in "options(as.character(vals_vector[1]) ="
> as.character(vals_vector[1])
[1] "temp"
> "temp"
[1] "temp"
毫无意义。你可以看到,我已经评估了这个论点,这两种情况都是一样的。就在其中,我使用了变量。我的意图是使用循环为数据集中存在的每个变量设置一个选项。为什么这不符合预期?
对于R中的参数名称,不能将函数调用用作stand-ins。这与options无关,这只是R解析器的工作方式。以下面的示例为例,使用函数data.frame。
data.frame(A_B = 2)
#> A_B
#> 1 2
假设我们希望以编程方式生成名称A_B:
paste("A", "B", sep = "_")
#> [1] "A_B"
看起来不错。但是,如果我们试图使用此函数调用,意图将其输出解释为参数名称,那么解析器只会告诉我们有一个语法错误:
data.frame(paste("A", "B", sep = "_") = 2)
#> Error: unexpected '=' in "data.frame(paste("A", "B", sep = "_") ="
有很多方法可以解决这个问题-对于大多数基本R函数,我们将以编程方式创建命名列表,并使用do.call将其作为参数列表传递:
然而,如果你阅读options的文档,它会说
因此,更简洁的习语是:
options(setNames(list(TRUE), vals_vector[1]))
getOption("temp")
#> [1] TRUE
本文来源https://www.5axxw.com/questions/content/xobd2d
相关文章