R の省略記号の引数リストを解凍する
-
26-09-2019 - |
質問
省略記号の使用に混乱しています (...
) 一部の関数、つまり引数を含むオブジェクトを単一の引数として渡す方法。
Python では、これは「引数リストのアンパック」と呼ばれます。
>>> range(3, 6) # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # call with arguments unpacked from a list
[3, 4, 5]
たとえばRでは次のような関数があります file.path(...)
省略記号を使用します。この動作をさせたいのですが:
> args <- c('baz', 'foob')
> file.path('/foo/bar/', args)
[1] 'foo/bar/baz/foob'
代わりに、私は得ます
[1] 'foo/bar/baz' 'foo/bar/foob'
ここでの要素は args
「解凍」と同時に評価されることはありません。Python に相当する R はありますか *arg
?
解決
構文はように美しいではありませんが、これはトリックを行います:
do.call(file.path,as.list(c("/foo/bar",args)))
do.call
は、2つの引数を取ります。機能として、その関数を呼び出す引数のリスト。
他のヒント
あなたは関数内list(...)
を呼び出すことにより、省略記号から情報を抽出することができます。この場合は、省略記号内の情報は、リストオブジェクトとしてパッケージされています。たとえばます:
> foo <- function(x,...){
+ print(list(...))
+ }
> foo(1:10,bar = 'bar','foobar')
$bar
[1] "bar"
[[2]]
[1] "foobar"
あなたは(file.path
パッケージ内の)ラッパーdo.call
splat
への呼び出し、とplyr
のようなベクトル化機能から目的の動作を実現することができます
> args <- c('baz', 'foob')
> library(plyr)
> splat(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"
見つけるのに少し時間がかかりましたが、 purrr
パッケージには同等のものがあります plyr::splat
:それは呼ばれています lift_dl
.
名前の「dl」は、一連のリストの一部であるため、「dots to list」を表します。 lift_xy
関数のドメインをある種類の入力から別の種類の入力に「リフト」するために使用できる関数。これらの「種類」はリスト、ベクトル、および「ドット」です。
以来 lift_dl
おそらくそれらの中で最も便利です。簡単な方法があります。 lift
エイリアスが提供されています。
上記の例を再利用するには:
> library(purrr)
> args <- c('baz', 'foob')
> lift(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"
所属していません StackOverflow