私は、文字列に基づいてデータフレームを操作する関数を作成しています。私は問題が何であるかを理解しなぜquoureは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")
:関数内で、私は、文字列からと列名を構築し、データフレームを操作するためにそれを使用して、このようなものでしょうfilter()
への引数としてquosureをunquoting破損したバージョンでは、実際の列anyAを参照していません。
summarize()
で動作する理由はわかりませんが、filter()
では何の違いがありますか?
ああ、なるほど! 'quo()'はシンボルをquosureに変換し、 'enquo()'は関数の引数の値をquosureに変換し、sym()は文字列をquosureに変換します。だから私は文字列を渡していたが、記号のように扱っていた。 'summarize_my_df_works()'で動作するように見えたのは、関数に基づいて要約することができたからです。 – crazybilly