【发布时间】:2020-08-11 13:45:13
【问题描述】:
下面是一个简单的例子,说明如何使用引号来动态重命名 tibble 列。
quoteExample = function() {
new_name = quo("new_name_value");
tibble(old_name=list(1,2,3)) %>%
rename( !! quo_name(new_name) := old_name)
}
quoteExample()
结果= tibble(new_name_value=list(1,2,3))
下面是相同的简单示例,但这次是在 lamda 中。
{function ()
new_name = quo("new_name_value");
tibble(old_name=list(1,2,3)) %>%
rename( !! quo_name(new_name) := old_name)
} ()
Result= is_quosure(quo) 中的错误:找不到对象“new_name”
为什么引号在 lamda 中失败,但在命名函数中却没有?这种差异从何而来?难道我做错了什么?
编辑:上面的例子已经被 Akrun 解决了,但是下面是另一个失败的例子,尽管建议的解决方案已经被应用了:
df = tibble(data=list(tibble(old_name= c(1,2,3))))
df %>%
mutate(data = map(data, (function(d){
new_name = quo("new_value")
d %>% rename( !! quo_name(new_name) := old_name)
})))
结果:is_quosure(quo) 中的错误:找不到对象“new_name”
这是因为另一个问题而失败吗?
【问题讨论】:
-
@akrun 我不确定你的意思,你能详细说明一下吗?
-
@akrun 谢谢,我纠正了错误,不幸的是这并没有解决问题。
-
@akrun 是的,'name' 的类型是字符,并且在运行 mutate 时包含值 "new_name_value" 。因此复制了其他示例。取消列出或将“名称”转换为角色没有区别。
-
你可以使用
rename_att1 %>% mutate(new = map2(name, data, ~ {new_name <- .x; .y %>% rename_at(vars(old_name), ~ new_name)})) -
@akrun 我已经简化了示例,以避免您建议的参数传递问题。
标签: r dplyr tidyverse tidyeval