R功能-为动态变量名称分配LMER

时间:2018-07-18 13:42:51

标签: r function assign

要创建一个更紧凑的脚本,我正在尝试创建我的第一个函数。

一般功能是:

    f.mean <- function(var, fig, datafile){
      require(lme4)
      change <- as.symbol(paste("change", var, sep=""))
      base <- as.symbol(paste("baseline", var, sep = ""))
      x <- substitute(lmer(change ~ base + (1|ID),  data=datafile))
      out<-eval(x)
      name <- paste(fig,".", var, sep="")
      as.symbol(name) <- out
      }
}

此函数的目的是输入varfigdatafile并输出包含fig.var的名为out的新变量(LMER的值)。

显然,很难“更改” <-左侧的变量名称。

到目前为止我们已经尝试过:

 - assign(name, out) 
 - as.symbol(name) <<- out
 - makeActive Binding("y",function() x, .GlobalEnv)
 - several rename options to rename out to the specified var name

有人可以帮助我将out值分配给此“运行”特定变量名吗?其他所有建议也都欢迎。

1 个答案:

答案 0 :(得分:0)

正如@Roland所说,在R(或任何一种)编程中,应避免使用间接环境操纵器,例如assignattachlist2env<<-等很难调试并破坏涉及显式定义的对象和方法的常规编程流程。

此外,避免在全球环境中泛滥成百上千个结构相似的对象,这些对象可能需要进行环境挖掘,例如lsmgeteapply。只需使用一个大容器(如命名元素列表)即可,它更易于管理,并使代码更易于维护。

具体来说,直接分配对象并将字符串文字(varfig)或对象(datafile)作为函数参数传递,并具有函数return的值。对于许多输入,使用lapplyMap(包装到mapply的列表)来保留所需的对象。考虑下面的调整,该调整根据字符串文字构建公式,并将其传递到模型中并最终返回结果。

f.mean <- function(var, fig, datafile){
  require(lme4)
  myformula <- as.formula(paste0("change", var, " ~ baseline", var, " + (1|ID)"))

  x <- lmer(myformula, data=datafile)
  return(x)
}

var_list <- # ... list/vector of var character literals
fig_list <- # ... list/vector of fig character literals

# BUILD AND NAME LIST OF LMER OUTPUTS  
lmer_list <- setNames(Map(f.mean, var_list, fig_list, MorArgs=df),
                      paste0(fig_list, ".", var_list))

# IDENTIFY NEEDED var*fig* BY ELEMENT NAME OF LARGER CONTAINER
lmer_list$fig1.var1
lmer_list$fig2.var2
lmer_list$fig3.var3