2013-03-09 101 views
8

有些時候有一個函數具有任意數量的參數。例如,bootstrapPage包閃亮的功能。如果我有一個data.frame,並且我想爲一行創建一個小部件,那麼我還沒有找到一個漂亮的方法來根據data.frame的行數傳遞參數的數量。到目前爲止,我生成腳本,並使用eval(parse(text="..."))用R中的列表替換參數

事實上的伎倆,傳遞R中的功能(key和value)是類似於list,所以我想知道如果有一種方法來論證結構傳遞參數作爲列表在R.

更具體地說,如果我有一個函數f和一個列表argv,是有辦法根據argv和名稱的匹配,以argv對象傳遞給ff的參數名稱,以及argv中的位置和f參數中的位置?

例如,讓

f <- function(a, b) a + b 
argv <- list(a=1, b=2) 

我應該如何通過argvf這相當於f(a=argv$a, b=argv$b)

或者,如果我們有:

f <- function(a, b, ...) { # some codes } 
argv <- list(a = 1, b = 2, 3, 4, 5) 

我應該如何通過argvf這相當於f(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]])

謝謝!

回答

11

您在查找do.call

do.call(f, argv) 

下面是一些例子

> args <- list(n = 10, mean = 3, sd = .5) 
> do.call(rnorm, args) 
[1] 3.589416 3.393031 2.928506 2.503925 3.316584 2.581787 2.686507 3.178877 
[9] 3.083885 2.821506 
> do.call(rnorm, list(10, 3, .5)) 
[1] 3.964526 2.838760 2.436684 3.068581 1.842332 3.739046 4.050525 3.097042 
[9] 3.665041 3.535947 
> f <- function(a, b) a + b 
> argv <- list(a=1, b=2) 
> do.call(f, argv) 
[1] 3 
> f <- function(a, b, ...){print(a);print(b);print(sum(...))} 
> argv <- list(a=1,b=2, 3, 4, 5) 
> do.call(f, argv) 
[1] 1 
[1] 2 
[1] 12 
+0

的例子尼斯集合。這是該語言的一個特徵,在「R介紹」中確實值得更好的處理。 – 2013-03-09 18:02:32

+2

+1爲偉大的例子 – 2013-03-09 18:55:16