目的:データフレームを最初の 引数として受け取る関数を作成し、さらに2つの引数、つまり引数のリストを dplyr::select
に渡して、関数が戻るようにします2つのデータフレーム。ここでrlang quoshuresとdplyrを使用して複数の引数リストを渡す
はargments df1
とdf2
がlist
ない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
を使用するようにエンドユーザーに依頼する必要はありませんalist
list
の代わりに引数を渡すために使用されました。
私はこの問題を解決するためにrlang::UQ
、rlang::UQE
、rlang::quo
とrlang::UQS
、rlang::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
の 構文は同じオブジェクトを返すようにdplyrでrlang パッケージを使用する方法はありますalist
?
packageVersion("dplyr")
# [1] ‘0.7.4’
packageVersion("rlang")
# [1] ‘0.1.2’
誰かが 'x < - list(dplyr :: contains(" r ")、dplyr :: matches("^.p。* "))しようとするとどうなりますか? y < - リスト(disp);それらの最初の課題は 'list()'では動作しませんが、 'alist()'では動作するため、本当に問題に遭っているので、my_select2(mtcars、x、y) – MrFlick
'dplyr()'を使っているので、おそらく 'list()'や 'alist()'の代わりに 'vars()'を使っているはずです。これはパッケージの他の部分でどのように使用されているかと一貫しています。 – MrFlick
私は 'dplyr(> = 0.7.0)'と 'rlang'の変更に重点を置いて、' dplyr :: vars() 'を忘れてしまった。それが答えでした。ありがとう、@MrFlick。私は解決策を投稿します。 – Peter