2013-03-09 58 views
8

Một số lần có một hàm có số đối số tùy ý. Ví dụ, chức năng bootstrapPage của gói sáng bóng. Nếu tôi có một data.frame và tôi muốn tạo ra một widget cho một hàng, thì tôi đã không tìm ra một cách khá tốt để truyền số lượng đối số theo số hàng của data.frame. Cho đến nay, tôi tạo kịch bản và sử dụng mẹo của eval(parse(text="..."))Thay thế đối số bằng một danh sách trong R

Thực tế, cấu trúc của đối số được chuyển đến hàm trong R (khóa và giá trị) tương tự như list, vì vậy tôi tự hỏi liệu có cách nào vượt qua đối số như một danh sách trong R. đặc biệt

hơn, nếu tôi có một hàm f và một danh sách argv, là có một cách để vượt qua các đối tượng trong argv-f theo sự kết hợp của các tên của argv và tên của các đối số của f và vị trí trong argv và vị trí trong đối số của f?

Ví dụ, chúng ta hãy

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

Làm thế nào tôi nên vượt qua argv-f tương đương với f(a=argv$a, b=argv$b)?

Hoặc nếu chúng ta có:

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

Làm thế nào tôi nên vượt qua argv-f tương đương với f(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]])?

Cảm ơn!

Trả lời

11

Bạn đang tìm kiếm do.call.

do.call(f, argv) 

Dưới đây là một số ví dụ

> 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

đẹp bộ sưu tập các ví dụ. Đây là một tính năng của ngôn ngữ thực sự xứng đáng được điều trị tốt hơn trong phần "giới thiệu về R". –

+2

+1 cho các ví dụ tuyệt vời –

Các vấn đề liên quan