2017-10-23 13 views
2

目的:データフレームを最初の 引数として受け取る関数を作成し、さらに2つの引数、つまり引数のリストを dplyr::selectに渡して、関数が戻るようにします2つのデータフレーム。ここでrlang quoshuresとdplyrを使用して複数の引数リストを渡す

はargments df1df2listないalist取ることを私が好む作業例

my_select <- function(.data, df1, df2) { 
    DF1 <- dplyr::select(.data, rlang::UQS(df1)) 
    DF2 <- dplyr::select(.data, rlang::UQS(df2)) 
    list(DF1 = DF1, DF2 = DF2) 
} 

working_eg <- 
    my_select(mtcars, 
      df1 = alist(dplyr::contains("r"), dplyr::matches("^.p.*")), 
      df2 = alist(disp)) 

str(working_eg, max.length = 1L) 

## List of 2 
## $ DF1:'data.frame': 32 obs. of 5 variables: 
## ..$ drat: num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
## ..$ gear: num [1:32] 4 4 4 3 3 3 3 4 4 4 ... 
## ..$ carb: num [1:32] 4 4 1 1 2 1 4 2 2 4 ... 
## ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
## ..$ hp : num [1:32] 110 110 93 110 175 105 245 62 95 123 ... 
## $ DF2:'data.frame': 32 obs. of 1 variable: 
## ..$ disp: num [1:32] 160 160 108 258 360 ... 

です。 ただし、引数がlist

my_select(mtcars, 
      df1 = list(dplyr::contains("r"), dplyr::matches("^.p.*")), 
      df2 = list(disp)) 
## Error: Variable context not set 

ある場合、関数my_selectは失敗します私は、可能な場合、私はそれをテストする 良い方法を持っていないとして、alistを使用するようにエンドユーザーに依頼する必要はありませんalistlistの代わりに引数を渡すために使用されました。

私はこの問題を解決するためにrlang::UQrlang::UQErlang::quorlang::UQSrlang::enquos、およびrlang::quosのいくつかの組み合わせを試してみました。私 は思ったことは最善のアプローチはあった:

my_select2 <- function(.data, df1, df2) { 
    DF1 <- dplyr::select(.data, rlang::UQS(rlang::quos(df1))) 
    DF2 <- dplyr::select(.data, rlang::UQS(rlang::quos(df2))) 
    list(DF1 = DF1, DF2 = DF2) 
} 

my_select2(mtcars, 
      df1 = list(dplyr::contains("r"), dplyr::matches("^.p.*")), 
      df2 = list(disp)) 
## Error: `df1` must resolve to integer column positions, not a list 

my_selectが 引数を経由して渡された場合も同様でmy_select2の 構文は同じオブジェクトを返すようにdplyrrlang パッケージを使用する方法はありますalist

packageVersion("dplyr") 
# [1] ‘0.7.4’ 
packageVersion("rlang") 
# [1] ‘0.1.2’ 
+0

誰かが 'x < - list(dplyr :: contains(" r ")、dplyr :: matches("^.p。* "))しようとするとどうなりますか? y < - リスト(disp);それらの最初の課題は 'list()'では動作しませんが、 'alist()'では動作するため、本当に問題に遭っているので、my_select2(mtcars、x、y) – MrFlick

+1

'dplyr()'を使っているので、おそらく 'list()'や 'alist()'の代わりに 'vars()'を使っているはずです。これはパッケージの他の部分でどのように使用されているかと一貫しています。 – MrFlick

+0

私は 'dplyr(> = 0.7.0)'と 'rlang'の変更に重点を置いて、' dplyr :: vars() 'を忘れてしまった。それが答えでした。ありがとう、@MrFlick。私は解決策を投稿します。 – Peter

答えて

0

@ MrFlickのコメントは、私が問題を解決してAPIを改善するために必要だったことを思い出させるものでした。

my_select3 <- function(.data, df1, df2) { 
    DF1 <- dplyr::select(.data, rlang::UQS((df1))) 
    DF2 <- dplyr::select(.data, rlang::UQS((df2))) 
    list(DF1 = DF1, DF2 = DF2) 
} 

working_eg2 <- 
    my_select3(mtcars, 
      df1 = dplyr::vars(dplyr::contains("r"), dplyr::matches("^.p.*")), 
      df2 = dplyr::vars(disp)) 

all.equal(working_eg, working_eg2) 
# [1] TRUE 
関連する問題