2011-12-20 43 views
14

Tôi có một chức năngluận Tránh trùng lặp qua (...)

somefun <- function(someparameters , ...) { plot(stuff, ...)} 

Bây giờ tôi muốn cung cấp một số giá trị mặc định cho cốt truyện trong trường hợp mà người sử dụng đã không được chỉ rõ những tranh cãi. (ví dụ: xlab="").

Làm cách nào để cung cấp một tập hợp các tùy chọn cốt truyện mặc định nhưng vẫn cho phép người dùng ghi đè các đối số đó? Vì nếu cùng một đối số được nhập hai lần, R sẽ ném lỗi: đối số chính thức được so khớp bởi nhiều đối số thực tế.

Tôi biết rằng tôi có thể vượt trên tất cả các tùy chọn này qua chức năng của tôi

somefun <- function(someparameters, main, xlab, ylab, xlim....) 

nhưng tôi không muốn làm điều đó.

Có một số giải pháp gọn gàng dễ dàng để đạt được điều này không?

+0

phản đối của bạn là gì cho 'somefun <- chức năng (someparamenters, chính, xlab = "", ...) {cốt truyện (thứ, xlab, ...)} '? Tôi đã nghĩ đó là chính xác những gì bạn muốn. – Henry

+0

Nó không gọn gàng. dường như không cần thiết và các thông số sẽ hiển thị trong tài liệu khi tôi đặt mã này trong gói – LostLin

+1

Tôi gửi rằng người dùng của bạn sẽ muốn các tham số này trong tài liệu và do đó đề xuất của Henry được ưu tiên. – Aaron

Trả lời

19

Cố gắng modifyList sử dụng như sau:

f <- function(x, ...) { 
    defaults <- list(xlab = "x", ylab = "y") 
    args <- modifyList(defaults, list(x = x, ...)) 
    do.call("plot", args) 
} 
+0

cảm ơn bạn đã trả lời. Tuy nhiên làm thế nào để tôi có được danh sách để hoạt động như một tham số bây giờ? tức là 'cốt truyện (1,2, args)' chắc chắn sẽ không hoạt động trong trường hợp này – LostLin

+1

@Ellipsis Đó là phép thuật của 'do.call': nó lấy các đối số như một danh sách. Xem thêm '? Do.call'. 1 cho 'modifyList', không biết cái đó. Tôi đã làm việc với kết quả 'match.call()', điều này rất xa gọn như thế này. –

+1

@Ellipsis, tôi đã sửa đổi nó để đưa ra một ví dụ 'plot'. –

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