2016-07-07 14 views
6

%in%を使用してfilter()を実行していますが、dplyrがクエリを変換する方法が正しくないようです。実際、%in%演算子は2つ以上の値で正常に動作しますが、1つの要素だけが存在する場合は正しく動作しません。 私の元のシナリオでは、フィルタリング値は動的なので、私は両方の場合に機能する関数を持っていたいと思います。1つの単一の値に基づいてリモートテーブルをフィルタリングする方法は?

my_db <- src_mysql(dbname = "dplyr", 
        host = "dplyr.csrrinzqubik.us-east-1.rds.amazonaws.com", 
        port = 3306, 
        user = "dplyr", 
        password = "dplyr") 
tbl(my_db, "dplyr") %>% filter(carrier %in% c("UA","AA")) #works 
tbl(my_db, "dplyr") %>% filter(carrier %in% c("UA")) #doesn't work 

私の質問はmultiple selectInput values create unexpected dplyr (postgres) behaviorの複製です。 this issueはよく知られているようです。

+2

dplyrのバージョンは何? SQL変換構造が0.5.0で変更されました。 – alistaire

+0

@alistaire 4.3を使用していましたが、今更新しましたが、問題はまだあります。 – Dambo

+2

これを回避するには%cの%...( "Art"、 "some_absent_junk") 'を使用しますか? (不満足ですが、回避策として役に立つかもしれません) –

答えて

0

いくつかの提案をまとめると、私のシナリオに最適なアプローチはおそらく以下のようになります。 filter()ifのステートメントにネストするのが好きでない理由は、光沢のあるアプリのメニュー項目から複数のfilterがあるということです。したがって、ソースで変数を操作すると、私は多くの型を省くことができます。

a <- c("UA") 
b <- if(length(a)>1) a else c(a,"") 
tbl(my_db, "dplyr") %>% 
    filter(carrier %in% b) 

それとも

a <- c("UA") 
varToFilterFor <- rep(a ,2) 
tbl(my_db, "dplyr") %>% 
     filter(carrier %in% varToFilterFor) 
3

コードが失敗する理由についての洞察を提供することはできません。しかし、誰かがより良いソリューションを提供できるようになるまで、ここでは「どちらの場合でも機能する機能」を提供する簡単な回避策があります。

my.carriers <- c("UA","AA") 
my.carriers <- c("UA") 

if (length(my.carriers)>1) { 
    tbl(my_db, "dplyr") %>% filter(carrier %in% my.carriers) 
} else { 
    tbl(my_db, "dplyr") %>% filter(carrier == my.carriers) 
} 
+0

はい、これは私の質問に追加したリンクに示唆されたものです。私は 'ifelse()'も検討していますが、パフォーマンスに関して同等かどうかはわかりません。 – Dambo

+0

私は最初の試みとして 'ifelse'を試しました - 私はそれを働かせることができませんでした。それは何らかの理由で質問を返すのを待たずにいるようです。 – dww

+0

おそらく、 "ifelse"のベクトル化が "テストと同じ形の値を返す"ためです。この例は、なぜd < - c( "AA"、 "AA"、 "EV"、 "DL")が動作しないのかを理解するのに役立ちました a < - c( "UA"、 "AA") ifelse (長さ(a)> 1){d%in%a} else {d == a} '(%)の長さ(a(長さ(a)> 1、d%in%a、d == a) – Dambo

関連する問題