我正在構建一個函數,我將基於一個字符串操縱數據框架。在函數,我將建立一個列名作爲從字符串並用它來操縱數據幀,這樣的事情:爲什麼在group_by()而不是filter()中工作?
library(dplyr)
orig_df <- data_frame(
id = 1:3
, amt = c(100, 200, 300)
, anyA = c(T,F,T)
, othercol = c(F,F,T)
)
summarize_my_df_broken <- function(df, my_string) {
my_column <- quo(paste0("any", my_string))
df %>%
filter(!!my_column) %>%
group_by(othercol) %>%
summarize(
n = n()
, total = sum(amt)
) %>%
# I need the original string as new column which is why I can't
# pass in just the column name
mutate(stringid = my_string)
}
summarize_my_df_works <- function(df, my_string) {
my_column <- quo(paste0("any", my_string))
df %>%
group_by(!!my_column, othercol) %>%
summarize(
n = n()
, total = sum(amt)
) %>%
mutate(stringid = my_string)
}
# throws an error:
# Argument 2 filter condition does not evaluate to a logical vector
summarize_my_df_broken(orig_df, "A")
# works just fine
summarize_my_df_works(orig_df, "A")
我的理解是什麼問題:unquoting的quosure作爲參數傳遞給filter()
在破碎的版本中沒有引用實際的列anyA。
我不明白的是爲什麼它在summarize()
中有效,但在filter()
中沒有 - 爲什麼有區別?
啊,我明白了! 'quo()'把一個符號變成一個平靜,'enquo()'把一個函數參數的值變成一個平靜,'sym()'把一個字符串變成一個平靜。所以我傳遞一個字符串,但把它當作符號來對待。它只出現在'summarize_my_df_works()'中,因爲你可以基於函數進行總結,而不是因爲它實際上正在做我所期望的。 – crazybilly