2010-08-05 86 views
28

在某些函數中,我對使用省略號(...)感到困惑,即如何將包含參數的對象作爲單個參數傳遞。在R中解析省略號的參數列表

在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的元素不「解包」,並在同一時間進行評估。是否有相當於Pythons *arg的R?

回答

30

實現從矢量化的功能類似於file.path所需的行爲語法不是很漂亮,但是這樣做很有用:

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

do.call有兩個參數:一個函數和一個參數列表來調用該函數。

+0

謝謝,這是做到了。 – mhermans 2010-08-08 08:09:35

+0

關於這項技術的擴展討論:https://www.r-bloggers.com/a-new-r-trick-for-me-at-least/ – Alex 2017-02-26 23:50:36

17

您可以通過在函數內調用list(...)來從省略號中提取信息。在這種情況下,省略號中的信息被打包爲列表對象。例如:

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

[[2]] 
[1] "foobar" 

可以與到do.call的呼叫時,其有時被簡單與包裝splat使用(在plyr包)

> args <- c('baz', 'foob') 
> library(plyr) 
> splat(file.path)(c('/foo/bar', args)) 
[1] "/foo/bar/baz/foob" 
+0

謝謝(不能upvote)。 – mhermans 2010-08-08 08:03:30