4

"derived_name"以下の再現可能な例では、データベースを検索し、元の検索から派生した名前で出力にラベルを付けようとしています。dplyrpipeを使用してい%>%ますが、quasiquotation および/または非標準評価に問題があります。具体的には、最終関数で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

この議論に基づいて、上記のコードが機能すると思いました。そして、この投稿は私を試してみるように導きましたがtop_n_()、これは存在しないようです。

私はvignette("programming")頭を少し超えていることを勉強しています。この投稿により、機能する構文を試すようになりました!! 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"
4

2 に答える 2