Tôi yêu do.call
. Tôi thích có thể lưu trữ các đối số hàm trong một danh sách và sau đó tách chúng vào một hàm đã cho.Cách thay thế cho do.call cho các tập dữ liệu lớn
Ví dụ, tôi thường thấy mình sử dụng mô hình này để phù hợp với một danh sách các mô hình dự báo khác nhau, với một số chia sẻ và một số thông số duy nhất cho mỗi mô hình:
library(caret)
global_args <- list(
x=iris[,1:3],
y=iris[,4],
trControl=trainControl(
method='cv',
number=2,
returnResamp='final',
)
)
global_args$trControl$index <- createFolds(
global_args$y,
global_args$trControl$number
)
model_specific_args <- list(
'lm' = list(method='lm', tuneLength=1),
'nn' = list(method='nnet', tuneLength=3, trace=FALSE),
'gbm' = list(
method='gbm',
verbose=FALSE,
tuneGrid=expand.grid(
n.trees=1:100,
interaction.depth=c(2, 3),
shrinkage=c(.1, .01)
)
)
)
list_of_models <- lapply(model_specific_args, function(args){
return(do.call(train, c(global_args, args), quote=TRUE))
})
resamps <- resamples(list_of_models)
dotplot(resamps, metric='RMSE')
global_args
chứa đối số là như nhau cho tất cả của các mô hình và model_specific_args
chứa danh sách các đối số theo mô hình cụ thể. Tôi vòng qua model_specific_args
, nối mỗi phần tử với global_args
và sau đó sử dụng do.call
để chuyển danh sách đối số cuối cùng cho hàm phù hợp với mô hình.
Trong khi mã này là trực quan thanh lịch, hiệu suất của nó là khủng khiếp: do.call
theo nghĩa đen tuần tự toàn bộ tập dữ liệu x dưới dạng văn bản và sau đó chuyển nó đến hàm phù hợp với mô hình. Nếu x là một vài GB dữ liệu, điều này sử dụng một lượng RAM điên rồ và thường không thành công.
print(list_of_models[[1]]$call)
Có ai cách để vượt qua một danh sách các đối số cho hàm trong R, mà không sử dụng do.call
hoặc call
?
Bạn đã thử rbind.fill từ gói plyr chưa. Tôi đã không đọc mã để biết nếu sản phẩm cuối cùng là một khung dữ liệu, nhưng nếu như vậy, sau đó rbind.fill là nhanh hơn đáng kể so với do.call tương đương (rbind, ...). Trong các trường hợp khác, tôi cũng đã thành công khi sử dụng Reduce (.) – jimmyb
@jimmyb Tôi không nghĩ 'rbind.fill' hoặc' Reduce' là thích hợp ở đây. Tôi không cố gắng kết hợp 'data.frames', tôi đang cố gắng chuyển danh sách các đối số tới một hàm. – Zach
Có [this] (http://stackoverflow.com/questions/13923301/is-there-a-work-around-for-slow-performance-of-do-callcbind-xts-in-r-2-15) Cứu giúp? – r2evans