gpt4 book ai didi

r - 整洁评估 : Evaluation of quosure in function within map

转载 作者:行者123 更新时间:2023-12-02 02:42:34 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数使用对象的名称(如未评估的符号)进行下游应用程序。下面是一个体现这种意义的例子:

return_obj_name <- function(obj){
inp <- enquo(obj)

inp_name <- rlang::as_name(inp) # Use the name for something
inp_data <- rlang::eval_tidy(inp) # This line just for completeness, not important here

return(inp_name)
}

以下是此函数的标准用例:

test_obj <- 42
return_obj_name(test_obj)

[1] "test_obj"

到目前为止,一切都很好。但是,我计划在map(或map2)语句中将我的函数用作匿名函数,这就是出现问题的地方。

test_obj2 <- 44
test_vec <- c(test_obj, test_obj2)
map(test_vec, ~ .x %>% return_obj_name())

[[1]]
[1] "."

[[2]]
[1] "."

预期的输出是:

[[1]]
[1] "test_obj"

[[2]]
[1] "test_obj2"

我想我确实明白发生了什么。该函数接收对初始对象的管道引用,该引用为“.”。它用 enquo 引用此内容并按设计继续。

我想知道是否有一种方法可以在调用 map 的环境中评估引用,而不是像现在这样在 map 调用中评估引用。

最佳答案

运行后

test_obj2 <- 44
test_vec <- c(test_obj, test_obj2)

test_vec不知道用于创建它的变量的名称。它只知道它是一个包含 42 和 44 的数字向量。跟踪每个变量的源会产生大量开销。

重要的是要记住,R 中的值没有名称;名称具有值(value)。而且它也不总是独一无二的。多个名称可以指向相同的值。

此外,管道运算符不保留变量名称。观察

test_obj %>% return_obj_name()
# [1] "."

如果你想跟踪值源的标签,你应该使用命名列表(但请记住,它是跟踪名称的集合,集合中的元素不知道它们是否被命名)或有一个单独的列表名称向量。 @Ronak 给出的答案提供了一些使用此策略的不错的替代方案。

另一种选择是将您的值存储为定额的集合。例如

test_vec <- quos(test_obj, test_obj2)
map(test_vec, ~return_obj_name(!!.x))

但是这里 test_vec 存储的是这些变量名称,而不一定是它们的值。您需要对其进行评估以获得值 42 和 44。

关于r - 整洁评估 : Evaluation of quosure in function within map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63331818/

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