2017-11-01 6 views
0

関数で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のバグですか、何か間違っていますか?

+0

予想される出力には、複数の行があります。 atをフィルタリングする必要があります。 – Frank

答えて

3

これは操作の問題の順序です。比較演算子(<=および>=)は、!演算子よりも高い優先順位を持ちます。あなたがする必要があります

df <- df %>% 
    filter((!!start_var) <= as.Date("2011-12-31") & 
      (!!end_var) >= as.Date("2011-01-01")) 

何らかの理由で、クォートが負の値を持つようですか?

xvar <- quo(x) 
quo(!!xvar <= 0) 
# ~TRUE 
quo(!!xvar >= 0) 
# ~FALSE 

は(私は完全には理解していない理由のために)

quo((!!xvar) <= 0) 
# ~(~x) <= 0 
quo((!!xvar) >= 0) 
# ~(~x) >= 0 

そして最後に...との比較

quo(x) <= 4 
# [1] TRUE 
quo(x) >= 4 
# [1] FALSE 

守っても、式

に関連すると思われます
(~x) <= 2 
# [1] TRUE 
(~x) >= 2 
# [1] FALSE 
+0

ありがとう、それはトリックでした。 quostureについても陰性であることを知っておくとよいでしょう。 – GenericNameNumber

関連する問題