質問

省略記号の使用に混乱しています (...) 一部の関数、つまり引数を含むオブジェクトを単一の引数として渡す方法。

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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top