R base::带变量的选项

2023-02-27 00:00:00 专区 订阅 变量 情况 很好

我注意到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

相关文章