2012-02-03 16 views
32

Tôi muốn viết một hàm nhỏ để tạo ra các mẫu từ phân phối thích hợp, một cái gì đó như:Chuyển danh sách các tham số có tên để hoạt động?

makeSample <- function(n,dist,params) 
values <- makeSample(100,"unif",list(min=0,max=10)) 
values <- makeSample(100,"norm",list(mean=0,sd=1)) 

Hầu hết các mã làm việc, nhưng tôi đang gặp vấn đề để tìm ra cách để vượt qua các thông số được đặt tên cho từng phân phối. Ví dụ:

params <- list(min=0, max=1) 
runif(n=100,min=0,max=1) # works 
do.call(runif,list(n=100,min=0,max=1)) # works 
do.call(runif,list(n=100,params)) # doesn't work 

Tôi đoán tôi đang thiếu chức năng trình bao bọc ở đâu đó nhưng không thể tìm ra.

Cảm ơn!

Trả lời

45

Gần đó: thử

do.call(runif,c(list(n=100),params)) 

biến thể của bạn, list(n=100,params) làm cho một danh sách trong đó yếu tố thứ hai là danh sách các tham số. Sử dụng str() để so sánh cấu trúc của list(n=100,params)c(list(n=100),params) ...

1

c(...) có tác dụng concatenating, hoặc trong FP cách nói, một tác dụng làm phẳng, vì vậy bạn có thể rút ngắn cuộc gọi; mã của bạn sẽ là:

params <- list(min=0, max=1) 
do.call(runif, c(n=100, params)) 

Hãy thử so sánh sau đây:

params = list(min=0, max=1) 
str(c(n=100, min=0, max=1)) 
str(list(n=100, min=0, max=1)) 
str(c(list(n=100),params)) 
str(c(n=100,params)) 

Hình như nếu một danh sách là ở đó bất cứ lúc nào, kết quả là một danh sách (đó là một tính năng mong muốn trong sử dụng này trường hợp)

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