要创建一个更紧凑的脚本,我正在尝试创建我的第一个函数。
一般功能是:
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
}
}
此函数的目的是输入var
,fig
和datafile
并输出包含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值分配给此“运行”特定变量名吗?其他所有建议也都欢迎。
答案 0 :(得分:0)
正如@Roland所说,在R(或任何一种)编程中,应避免使用间接环境操纵器,例如assign
,attach
,list2env
,<<-
等很难调试并破坏涉及显式定义的对象和方法的常规编程流程。
此外,避免在全球环境中泛滥成百上千个结构相似的对象,这些对象可能需要进行环境挖掘,例如ls
,mget
或eapply
。只需使用一个大容器(如命名元素列表)即可,它更易于管理,并使代码更易于维护。
具体来说,直接分配对象并将字符串文字(var
,fig
)或对象(datafile
)作为函数参数传递,并具有函数return
的值。对于许多输入,使用lapply
或Map
(包装到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