R 调用存储在列表中的函数参数

R 调用存储在列表中的函数参数,r,user-defined-functions,drc,R,User Defined Functions,Drc,我需要测试一组参数条件,以便找到最佳模型(使用drc包)。也就是说,我想将函数参数存储在一个列表中,然后将它们调用到drm()函数中。drc软件包有一个函数(mselect())来执行此操作,但已知由于未知原因失败() 示例数据 library(drc) # This also loads in the S.alba data data(S.alba) head(S.alba) Dose Herbicide DryMatter 1 0 Glyphosate 4.7 2

我需要测试一组参数条件,以便找到最佳模型(使用
drc
包)。也就是说,我想将函数参数存储在一个列表中,然后将它们调用到
drm()
函数中。
drc
软件包有一个函数(
mselect()
)来执行此操作,但已知由于未知原因失败()


示例数据

library(drc) # This also loads in the S.alba data
data(S.alba)

head(S.alba)
  Dose  Herbicide DryMatter
1    0 Glyphosate       4.7
2    0 Glyphosate       4.6
3    0 Glyphosate       4.1
4    0 Glyphosate       4.4
5    0 Glyphosate       3.2
6    0 Glyphosate       3.0

尝试失败

# List of function arguments to be assessed e.g. drm(...fct = W1.4(fixed = c(NA, 0.1, NA, NA)
model_list <- list(curve = c(W1.4(fixed = c(NA, 0.1, NA, NA)),
                             LL.4(fixed = c(NA, 0.1, NA, NA))))

# Failed function, attempting to return a list of results
model_select <- function(data, mlist){
    model =  data %>%
        drm(DryMatter ~ Dose, Herbicide, data = . , fct = mlist)
    metric = AIC(model)
    return(metric)
}
model_select(data = S.alba, mlist = model_list)
model_select_2 <- function(data){
    model =  data %>%
        drm(DryMatter ~ Dose, Herbicide, data = . , fct = W1.4(fixed = c(NA, 0.1, NA, NA)))
    metric = AIC(model)
    return(metric)
}
model_select_2(data = S.alba)

model_select_2(data = S.alba)
[1] 106.9226
model_select(data = S.alba, mlist = model_list)
[1] W1.4-106.9226
[2] LL.4-99.54702

部分问题在于如何创建
模型列表
。您希望将这些值与
list()
组合,而不是与
c()
组合。后者试图将它们组合成同一个对象

下一步可以做的是对曲线列表进行
sapply
,以获得每个输入的结果。一个有效的例子是

model_list <- list(curve = list(W1.4(fixed = c(NA, 0.1, NA, NA)),
                             LL.4(fixed = c(NA, 0.1, NA, NA))))
model_select <- function(data, mlist){
   sapply(mlist$curve, function(curve){
      model <- drm(DryMatter ~ Dose, Herbicide, data = data , fct = curve)
      metric = AIC(model)
   })
}
model_select(data = S.alba, mlist = model_list)
# [1] 106.92259  99.54702

model\u list抱歉,最后一个代码块应该是函数
model\u select()
Hey@akrun的所需输出,我忘了在所需输出中添加“曲线”名称。可能是一个正则表达式,然后
paste0()
,但不确定!它是一个元素的列表。因此,如果您执行
fct=mlist[[1]]
操作,应该可以正常工作!我从来没有想过制作一个列表……是否可以将曲线名称添加到结果中,以便我知道哪个模型最好?(请参阅更新的“期望输出”)好吧,除非您在子列表中命名元素,否则这不是非常容易的。从函数调用中猜出名称有点混乱。然后,如果愿意,可以将该数据粘贴到结果中。