【发布时间】:2020-11-29 13:31:20
【问题描述】:
我正在尝试编写一个函数,该函数将对象的名称(如未评估的符号)用于下游应用程序。下面是一个抓住意义的例子:
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 调用中,就像现在发生的那样。
【问题讨论】:
-
你为什么需要这个?目的是什么?如果您对这些名称感兴趣,请查看
imap -
“我为什么需要它?”是什么意思?问题还不够吗?我不想要名字,我想要经过解析的带引号的符号。
-
问题是 42 和 44 不是名称而是值。例如,如果你有数据框怎么办?您希望整个数据框成为 NAME 吗?
-
42 和 44 的预期输出令人困惑 - 如果您对这些值感兴趣,我相信您的
inp_data行会返回。如果您对test_obj和test_obj2感兴趣,我不确定它们是否可以恢复 - 我不相信test_vec在构造此示例时仍会知道它的起源。 -
magrittr 管道通过数据屏蔽
.并将该值传递给管道函数来工作。如果您化解管道参数,则完全可以看到.。