% ,并且我在准报价和/或非标准评估方面遇到了麻烦。具体来说-6ren">
gpt4 book ai didi

r - dplyr() 中的非标准评估和 quasiquotation 未按(天真)预期工作

转载 作者:行者123 更新时间:2023-12-05 00:12:06 24 4
gpt4 key购买 nike

我正在尝试搜索数据库,然后使用源自原始搜索的名称标记输出,"derived_name"在下面的可重现示例中。我正在使用 dplyr管道 %>% ,并且我在准报价和/或非标准评估方面遇到了麻烦。具体来说,使用 count_colname , 派生自 "derived_name" 的字符对象,在最后 top_n()函数无法对数据帧进行子集化。

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 的问题和评论的其他令人困惑的示例。让我感到困惑的是,帮助文件说 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"

最佳答案

根据 top_n文档( ?top_n ),它不支持 character/string输入因此第一个示例不起作用。在您的第二个示例中,rlang::sym将字符串转换为变量名,然后 !!取消引用它以便它可以在 top_n 内进行评估.注: top_n 和其他 dplyr verbs自动引用他们的输入。

使用 rlang::qq_show正如@lionel 所建议的,我们可以看到它不起作用,因为没有 count_colname栏目letrs_count.df

library(tidyverse)

set.seed(1)
letrs <- letters[rnorm(52, 13.5, 5)]
letrs_count.df <- letrs %>%
table() %>%
as.data.frame()

search_name <- "derived_name"
count_colname <- paste0(search_name, "_letr_count")
colnames(letrs_count.df) <- c("letr", count_colname)
letrs_count.df
#> letr derived_name_letr_count
#> 1 b 1
#> 2 c 1
#> 3 f 2
...

rlang::qq_show(top_n(letrs_count.df, 5, count_colname))
#> top_n(letrs_count.df, 5, count_colname)
sym & !!创建存在于 letrs_count.df 中的正确列名
rlang::qq_show(top_n(letrs_count.df, 5, !! sym(count_colname)))
#> top_n(letrs_count.df, 5, derived_name_letr_count)

letrs_count.df %>%
top_n(5, !! sym(count_colname))
#> letr derived_name_letr_count
#> 1 l 5
#> 2 m 6
#> 3 o 7
#> 4 p 5
#> 5 q 6
top_n(x, n, wt)
参数:
  • x :tbl()过滤
  • n : 要返回的行数。如 x被分组,这是每组的行数。将包括超过 n行,如果有关系。如 n为正,选择顶部 n行。如果为负,则选择底部 n行。
  • wt : (可选的)。用于排序的变量。如果未指定,默认为 tbl 中的最后一个变量.
    这个参数被自动引用,然后在数据框的上下文中进行评估。它支持取消引用。见 vignette("programming")介绍这些概念。

  • 另请参阅这些答案: 1st , 2nd , 3rd

    关于r - dplyr() 中的非标准评估和 quasiquotation 未按(天真)预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51738267/

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