【发布时间】:2018-08-08 03:35:03
【问题描述】:
我正在尝试搜索数据库,然后使用源自原始搜索的名称标记输出,"derived_name" 在下面的可重现示例中。我正在使用dplyr 管道%>%,并且在进行准引用和/或非标准评估时遇到了麻烦。具体来说,在最终的top_n() 函数中使用派生自"derived_name" 的字符对象count_colname 无法对数据帧进行子集化。
search_name <- "derived_name"
set.seed(1)
letrs <- letters[rnorm(52, 13.5, 5)]
letrs_count.df <- letrs %>%
table() %>%
as.data.frame()
count_colname <- paste0(search_name, "_letr_count")
colnames(letrs_count.df) <- c("letr", count_colname)
letrs_top.df <- letrs_count.df %>%
top_n(5, count_colname)
identical(letrs_top.df, letrs_count.df)
# [1] TRUE
基于this discussion 我认为上面的代码可以工作。还有this post带我去试试top_n_(),好像不存在。
我正在学习vignette("programming"),这有点超出我的想象。 This post 引导我尝试 !! sym() 语法,它有效,但我不知道为什么!帮助理解为什么下面的代码工作将不胜感激。谢谢。
colnames(letrs_count.df) <- c("letr", count_colname)
letrs_top.df <- letrs_count.df %>%
top_n(5, (!! sym(count_colname)))
letrs_top.df
# letr derived_name_letr_count
# 1 l 5
# 2 m 6
# 3 o 7
# 4 p 5
# 5 q 6
以下基于@lionel 和@Tung 的问题和cmets 的其他令人困惑的示例。这里让我感到困惑的是,帮助文件说sym()“将字符串作为输入并将它们转换为符号”和!!“取消引用它的论点”。但是,在下面的示例中,sym(count_colname) 似乎取消了对derived_name_letr_count 的引用。我不明白为什么!! sym(count_colname) 中需要!!,因为sym(count_colname) 和qq_show(!! sym(count_colname)) 给出相同的值。
count_colname
# [1] "derived_name_letr_count"
sym(count_colname)
# derived_name_letr_count
qq_show(count_colname)
# count_colname
qq_show(sym(count_colname))
# sym(count_colname)
qq_show(!! sym(count_colname))
# derived_name_letr_count
qq_show(!! count_colname)
# "derived_name_letr_count"
【问题讨论】:
-
dplyrautomatically quotes its inputs。这是top_n的源代码:它使用enquo和!!来引用和取消引用输入。运行qq_show(!!quo(sym(count_colname))),看看为什么你需要在提供给top_n之前先用!!取消引用sym(count_colname)
标签: r dplyr tidyeval non-standard-evaluation quasiquotes