2011-06-27 28 views
12

Tôi đã gặp khó khăn khi tìm thông tin về cách chuyển danh sách tới một hàm trong R.Làm cách nào để chuyển danh sách sang một hàm trong R?

Tôi đã sử dụng phương pháp này trước đây, ví dụ:

plot(list(x=1,y=1)) 

nhưng ví dụ sau đây mang lại cho tôi một lỗi:

foo <- function(a, b) c <- a + b 
foo(list(a=1,b=1)) 

Error in foo(list(a = 1, b = 1)) : 
    argument "b" is missing, with no default 

Hơn nữa, ?function không hoạt động và help('function') không cung cấp thông tin về đi qua một danh sách việc cần một hàm.

cập nhật

Để làm rõ, tôi hiểu làm thế nào tôi có thể sử dụng một danh sách như một đối số duy nhất, nhưng tôi đã nhầm lẫn bởi vì tôi đã theo ấn tượng rằng một tài sản của chức năng là nhiều lý lẽ có thể được thông qua như một danh sách. Có vẻ như lần hiển thị này không chính xác. Thay vào đó, nhiều hàm được viết đặc biệt để xử lý danh sách, như được mô tả trong phần bình luận và câu trả lời bên dưới.

+0

Bạn đang đi qua một đối số duy nhất để chức năng của bạn mà hy vọng 2. Cuộc gọi đúng sẽ là: foo (a = danh sách (1), b = danh sách (2)). Nếu bạn muốn chuyển đến hàm của bạn một danh sách duy nhất thì bạn phải khai báo nó là hàm (a) và sau đó gọi nó giống như cách bạn đã làm. Logic chức năng của bạn cũng bị tắt vì bạn không thể thêm đối số không phải số theo cách như vậy và bạn sẽ phải lập chỉ mục danh sách trong phần thân hàm để đạt được những gì bạn muốn (đoán ở đây) tức là [[1]] + b [[1]]. – diliop

+1

Tôi đã không xem xét nó, nhưng tôi đoán rằng 'cốt truyện' có một phương pháp xử lý danh sách. Để làm một cái gì đó tương tự với 'foo', bạn sẽ cần phải làm cho nó chung chung và viết các phương pháp thích hợp. –

+0

@Joshua, cảm ơn bạn đã làm rõ. Tôi đã ấn tượng rằng một danh sách có thể được thông qua mà không cần xử lý đặc biệt. –

Trả lời

23

Sử dụng do.call

foo <- function(a, b) a + b 

do.call(foo, list(a=1,b=1)) 

Hoặc bạn có thể làm

foo <- function(l) l$a + l$b 

foo(list(a=1,b=1)) 
+1

cảm ơn. Hàm 'do.call' rất tuyệt! –

5

Chức năng của bạn có hai đối số nhưng bạn chỉ được đi qua một, vì thế mà lỗi.

Bạn có thể sửa đổi mã của bạn như vậy:

foo <- function(a) c <- a[[1]] + a[[2]] 
foo(list(a=1,b=1)) 
Các vấn đề liên quan