51

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

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ますか?

4

3 に答える 3

44

構文はそれほど美しくはありませんが、これでうまくいきます。

do.call(file.path,as.list(c("/foo/bar",args)))

do.call関数と、その関数を呼び出すための引数のリストの2つの引数を取ります。

于 2010-08-05T11:26:29.737 に答える
24

関数内を呼び出すことにより、省略記号から情報を抽出できlist(...)ます。この場合、省略記号の情報はリストオブジェクトとしてパッケージ化されます。例えば:

> foo <- function(x,...){
+   print(list(...))
+ }
> foo(1:10,bar = 'bar','foobar')
$bar
[1] "bar"

[[2]]
[1] "foobar"

file.pathの呼び出しのように、ベクトル化された関数から目的の動作を実現できますdo.call。これは、ラッパーsplatplyrパッケージ内)で使用する方が簡単な場合があります。

> args <- c('baz', 'foob')
> library(plyr)
> splat(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"
于 2010-08-05T11:19:52.157 に答える
7

それを見つけるのに少し時間がかかりましたが、purrrパッケージには次のものと同等のものがありますplyr::splat:それはと呼ばれlift_dlます。

名前の「dl」は「dotstolist」を表します。これlift_xyは、関数のドメインをある種類の入力から別の種類に「持ち上げる」ために使用できる一連の関数の一部であり、これらの「種類」はリスト、ベクトル、および「ドット」。

lift_dlおそらくそれらの中で最も有用なのでlift、それに提供される単純なエイリアスがあります。

上記の例を再利用するには:

> library(purrr)
> args <- c('baz', 'foob')
> lift(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"
于 2018-10-08T10:00:11.237 に答える