gpt4 book ai didi

r - 用于大型数据集的 do.call 的替代方案

转载 作者:行者123 更新时间:2023-12-03 03:47:53 24 4
gpt4 key购买 nike

我喜欢do.call。我喜欢能够将函数参数存储在列表中,然后将它们分配给给定的函数。

例如,我经常发现自己使用此模式来拟合不同预测模型的列表,每个模型都有一些共享参数和一些独特参数:

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 包含所有模型都相同的参数,model_specific_args 包含特定于模型的参数列表。我循环 model_specific_args,将每个元素与 global_args 连接,然后使用 do.call 将最终参数列表传递给模型拟合函数。

虽然这段代码在视觉上很优雅,但其性能却很糟糕:do.call实际上将整个x数据集序列化为文本,然后将其传递给模型拟合函数。如果 x 是几 GB 的数据,则会使用大量 RAM,并且通常会失败。

print(list_of_models[[1]]$call)

有没有办法在不使用 do.callcall 的情况下将参数列表传递给 R 中的函数?

最佳答案

rlang::invoke为我工作。

它已被软弃用,取而代之的是 exec,但仍然可以完成工作。

关于r - 用于大型数据集的 do.call 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28198103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com