Я пытаюсь выполнить поиск в базе данных, а затем пометить выход именем, полученным из исходного поиска, "derived_name"
в воспроизводимом примере ниже. Я использую dplyr
pipe %>%
, и у меня возникают проблемы с квазиквотированием и / или нестандартной оценкой. В частности, при использовании 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. Что меня сбивает с толку, так это то, что в справке fils сказано, что 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"
dplyr
автоматически цитирует свои входные данные. Вот исходный кодtop_n
: он используетenquo
&!!
, чтобы цитировать и отменять цитирование входных данных. Запуститеqq_show(!!quo(sym(count_colname)))
, чтобы узнать, почему вам нужно сначала убрать кавычкиsym(count_colname)
с помощью!!
перед отправкой в top_n
- person Tung   schedule 12.09.2018