関数でdplyrを使用しているときに問題が発生しました。閉鎖に基づいてフィルタリングすると、>記号が表示され、データが返されない問題が発生します。例えば符号と閉鎖のエラーよりも大きい
:
temp_df <- data.frame(
startdate_c = as.Date(c("2011-08-08", "2007-09-01", "2012-01-01", "2012-10-26", "2012-12-01",
"2016-01-01", "2006-06-01", "2009-04-01", "2005-02-09", "2004-08-01")),
enddate_c = as.Date(c("2011-08-14", "2012-09-04", "2014-06-06", "2014-02-28", "2013-04-05",
"2016-12-01", "2008-04-18", "2009-08-16", "2006-04-30", "2007-06-02")))
ここでは、関数の機能縮小版です:
filter_f <- function(df, startdate = NULL, enddate = NULL) {
if(!missing(startdate)) {
start_var <- enquo(startdate)
} else if("startdate_c" %in% names(df)) {
start_var <- quo(startdate_c)
} else {
stop("No valid startdate found")
}
if(!missing(enddate)) {
end_var <- enquo(enddate)
} else if("enddate_c" %in% names(df)) {
end_var <- quo(enddate_c)
} else {
stop("No valid enddate found")
}
df <- df %>%
filter(!!start_var <= as.Date("2011-12-31") &
!!end_var >= as.Date("2011-01-01"))
return(df)
}
予想される出力:
startdate_c enddate_c
1 2011-08-08 2011-08-14
2 2007-09-01 2012-09-04
3 2012-01-01 2014-06-06
4 2012-10-26 2014-02-28
5 2012-12-01 2013-04-05
6 2016-01-01 2016-12-01
は代わりに、空のデータフレームが返されます。私は、コードを微調整し、終了日に名前を付けるのではなくquosureを使用している場合
、それが動作します:
filter_f2 <- function(df, startdate = NULL, enddate = NULL) {
if(!missing(startdate)) {
start_var <- enquo(startdate)
} else if("startdate_c" %in% names(df)) {
start_var <- quo(startdate_c)
} else {
stop("No valid startdate found")
}
if(!missing(enddate)) {
end_var <- enquo(enddate)
} else if("enddate_c" %in% names(df)) {
end_var <- quo(enddate_c)
} else {
stop("No valid enddate found")
}
df <- df %>%
filter(!!start_var <= as.Date("2011-12-31") &
enddate_c >= as.Date("2011-01-01"))
return(df)
}
同じですSTARTDATEと終了日quosuresを作成するためのコード、と私はので、フィルタを切り替えたときstartdateに> =記号がある場合、空のdf問題が再度発生します。これはdplyrのバグですか、何か間違っていますか?
予想される出力には、複数の行があります。 atをフィルタリングする必要があります。 – Frank