gpt4 book ai didi

r - 取消引用 `rlang::expr` 中的循环变量

转载 作者:行者123 更新时间:2023-12-01 13:18:43 25 4
gpt4 key购买 nike

我在使用运算符 !! 迭代构造涉及循环变量的表达式时遇到了意外行为。

从循环变量本身创建一个表达式,例如,

X <- list()
for( i in 1:3 )
X[[i]] <- rlang::expr( !!i )
str(X)
# List of 3
# $ : int 1
# $ : int 2
# $ : int 3

按预期工作。但是,尝试构造任何涉及循环变量的复杂表达式,例如

Y <- list()
for( i in 1:3 )
Y[[i]] <- rlang::expr( 1 + (!!i) )
str(Y)
# List of 3
# $ : language 1 + 3L
# $ : language 1 + 3L
# $ : language 1 + 3L

似乎生成包含循环变量最终值的表达式。这几乎就像表达式在循环期间被捕获为 quote( 1 + (!!i) ) 一样,但是通过 !! 取消引用仅在整个循环结束后发生执行,而不是在每次迭代时执行。

有人可以阐明这种行为吗?这是一个错误吗?预期目标是通过循环捕获未计算的表达式 1+11+21+3。因此,Y 的预期输出将是

# List of 3
# $ : language 1 + 1L
# $ : language 1 + 2L
# $ : language 1 + 3L

旁注:!!i 周围的额外括号用于解决 the potential issue of operator precedence .

使用 rlang 0.2.1

最佳答案

for 似乎创建了某种环境/框架,在其中评估发生在最后(对于最后一个 i)。一种可能的处理方法是避免使用 for 并使用 purrr::lapply

Y <- purrr::map(1:3, ~ rlang::expr( 1 + (!! .) )) 
str(Y)
#> List of 3
#> $ : language 1 + 1L
#> $ : language 1 + 2L
#> $ : language 1 + 3L

Y <- lapply(1:3, function(i) rlang::expr( 1 + (!! i) ))
str(Y)
#> List of 3
#> $ : language 1 + 1L
#> $ : language 1 + 2L
#> $ : language 1 + 3L

while 在控制台中工作,但在与 reprex 一起使用时失败(未显示)。

Y <- list()
i <- 1L
while (i <= 3) {
Y[[i]] <- rlang::expr( 1 + (!!i) )
i <- i + 1L
}
str(Y)
#> List of 3
#> $ : language 1 + 1L
#> $ : language 1 + 2L
#> $ : language 1 + 3L

关于r - 取消引用 `rlang::expr` 中的循环变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52032590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com