首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >drc包的mselect函数在函数内不起作用

drc包的mselect函数在函数内不起作用
EN

Stack Overflow用户
提问于 2018-05-02 00:10:47
回答 2查看 240关注 0票数 1

我想使用drc软件包中的mselec函数来选择剂量反应数据集的最佳模型。但是,如果在函数中使用mselect,则它不起作用。

下面的代码可以工作:

代码语言:javascript
复制
library(drc)
ryegrass.m1 <- drm(rootl~conc, data = ryegrass, fct = LL.4())

mselect(ryegrass.m1,list(LL.5(), LN.4(), W1.4(), W2.4()))

但不是这个:

代码语言:javascript
复制
best.fit=function(data){  
model1=drm(rootl~conc, data=data, fct=LL.4())
M1=drc::mselect(model1, list(LL.5(), LN.4(), W1.4(), W2.4()))
return(M1)
}

best.fit(ryegrass)

我认为这个问题与R中的环境有关,但我不知道如何解决它。有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2018-05-02 05:16:34

我设法像这样解决了这个问题:

代码语言:javascript
复制
best.fit=function(data){
  mf <- match.call(expand.dots = FALSE)
  m <- match(c("data"), names(mf), 0L)
  data.name=as.character(mf[m])

  model1=eval(parse(text=paste0('drm(rootl~conc, data=',data.name, ',fct=LL.4())')))
  M1=drc::mselect(model1, list(LL.5(), LN.4(), W1.4(), W2.4()))
  return(M1)
}

best.fit(ryegrass)

应该有更好的方法来做到这一点,但至少现在它对我来说是有效的。

票数 0
EN

Stack Overflow用户

发布于 2019-02-24 04:27:49

当从函数内部运行时,mselect中的update函数似乎并不访问原始数据帧。我的解决方案是在第34行添加一个data参数。

代码语言:javascript
复制
[1]     my_mselect <- function(...
...
[33]    tempObj <- try(update(object, fct = fctList[[i]],
[34]                          data = object$origData),    # <--- line added here
[35]                          silent = TRUE)

我还注意到,如果使用模型变量的相对位置而不是原始名称,则对模型变量的引用也不起作用,例如使用drm(data[, 1] ~ data[, 2], fct = LL.4())时。为了避免这种情况,您可以在函数中使用临时数据帧,根据需要设置变量名称,并在drm调用中使用这些名称。

代码语言:javascript
复制
best.fit <- function(data){
  tmp_data <- data
  names(tmp_data) <- c("Var1", "Var2")
  model1 <- drm(Var1 ~ Var2, data = tmp_data, fct = LL.4())
  M1 <- my_mselect(model1, list(LL.5(), LN.4(), W1.4(), W2.4()))
  return(M1)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50119927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档