为了创建一个更紧凑的脚本,我正在尝试创建我的第一个函数。
一般功能是:
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
,并输出包含out
(LMER的eval(的名为fig.var
的新变量。
显然,很难"更改"<-
左侧的变量名。
到目前为止,我们已经尝试过:
- 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值分配给这个"运行"特定的变量名吗?欢迎所有其他建议。
正如@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