2013-03-09 2 views
8

임의의 수의 인수가있는 함수가 있습니다. 예를 들어 반짝이는 패키지 bootstrapPage의 기능입니다. data.frame이 있고 한 행에 하나의 위젯을 만들고 싶다면 data.frame의 행 번호에 따라 인수의 수를 전달하는 예쁜 방법을 찾지 못했습니다. 지금까지 스크립트를 생성하여 트릭을 사용했습니다. eval(parse(text="..."))인수를 목록의 목록으로 바꾸십시오.

실제로 R (키와 값)의 함수에 전달되는 인수의 구조는 list과 비슷하므로 다음과 같은 방법이 있는지 궁금합니다. I 함수 f 및 목록 argv있는 경우

구체적 R.에 목록으로 인수를 전달 argv 및 이름의 매칭에 따라 fargv에서 객체를 전달하는 방법이있다 인수의 이름은 f이고, 위치는 argv이고 인수의 위치는 f입니까? 예를 들어

하자
f <- function(a, b) a + b 
argv <- list(a=1, b=2) 
나는 argv f(a=argv$a, b=argv$b)에 해당 f에 전달하는 방법을

?

아니면이있는 경우 :

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

어떻게 통과해야 argvf(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]])에 해당 f에?

감사합니다.

답변

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에 대한 소개"에서 더 나은 대우를받을 가치가있는 언어의 특징입니다. –

+2

+1 좋은 예 –

관련 문제