在函数中传递参数名称和值

我已经有一些函数可以操纵同一对象的名称和其他属性。尽管它们各自运行良好,但我很难编写一个“控件”,可以一口气将论点传递给所有这些控件。

到目前为止,我已将问题缩小到参数的名称。为了说明,下面的简化代码显示了将名称从“控件”(f2)传递到各个功能(f1)的失败。

x=7
f1<-function(a){
    label<-deparse(substitute(a))
    cat("f1 value:",a,"\n")
    cat("f1 label:",label,"\n")
}

f2<-function(b){
    label<-deparse(substitute(b))
    cat("f2 value:",b,"\n")
    cat("f2 label:",label,"\n")
    f1(b)
}
f2(x)


#>f2 value: 7 
#>f2 label: x 
#>f1 value: 7 
#>f1 label: b

似乎对象x已正确传递到f2,如返回值7和名称“ x”所指示。但是当在f2中调用f1时,我只能传递对象x的值,而不是名称。如果我错了,请指正我,但我的理解是f1仅通过参数看到名称“ b”与值7之间的绑定。

在此示例中,有没有办法让f1读取“ x”的名称和值?我对R相当陌生,并尝试将我对环境,评估和电话的半熟知识毫无用处。我发现的唯一解决方案是在f2中通过<<-使用assign“ label”作为全局变量,这远非理想。

预先感谢您的任何投入。

编辑:完整的更正代码

感谢MrFlick的建议。这是我要解决的实际问题(现已解决)的代码。由于我是R语言的新手,所以我仍然希望您能提出一些更好的建议。

基本上,我估计了几十个lmerlme4程序包的.99x版本)模型,并且希望最终将这些输出汇总到Excel文件中。在下面的代码,lmer.statslmer.fixef,和lmer.ranef所有创建基于对应的结果的数据帧。lmer.append用于调用这三个函数以及rbind结果。

由于模型太多,我需要创建一个额外的id变量标签,以在汇总输出中将一个模型与另一个模型区分开。这个想法是提取参数名称,并使其成为一个标识符变量,直到MrFlick提出类似的建议之前,我一直对此感到困扰...现在,此修复程序非常有效。

## model summary statistics
lmer.stats<-function(lmer.name) {
    A<-AIC(lmer.name)
    B<-BIC(lmer.name)
    ll<-logLik(lmer.name)
    dv<-deviance(lmer.name)
    obs.TIME<-length(lmer.name@y)
    obs.CHILD<-sapply(ranef(lmer.name),nrow)[1]
    names(obs.CHILD)<-NULL
    obs.SCHOOL<-sapply(ranef(lmer.name),nrow)[2]
    names(obs.SCHOOL)<-NULL
    label<-deparse(substitute(lmer.name))
    df<-data.frame(label, "AIC"=A, "BIC"=B, "LL"=ll, "DEV"=dv, "N"=obs.TIME, "CHILD"=obs.CHILD, "SCHOOL"=obs.SCHOOL)
}
## random effects
lmer.ranef<-function(lmer.name){
    re<-data.frame(summary(lmer.name)@REmat)
    re<-subset(re,select=-Name)
    label<-deparse(substitute(lmer.name))   # identifier
    nr<-nrow(summary(lmer.name)@REmat)
    md<-data.frame(rep(label,nr))
    colnames(md)<-"Model"

    dfr<-data.frame(cbind(md,re))

    if (ncol(dfr)==4)   {       # random slope models have additional columns
        corr.col<-data.frame(rep(NA,nr))
        colnames(corr.col)<-"Corr"
        V6.col<-data.frame(rep(NA,nr))
        colnames(V6.col)<-"V6"
        dfr<-data.frame(cbind(dfr,corr.col,V6.col))
    }   else {
                dfr<-dfr
        }
}
## fixed effects
lmer.fixef<-function(lmer.name){
    beta<-data.frame("Beta"=fixef(lmer.name))
    se<-data.frame("S.E."=sqrt(diag(vcov(lmer.name))))
    vars<-data.frame(row.names(beta))
    colnames(vars)<-"Variable"
    vars$Variable<-gsub("\\)", "", vars$Variable)   # deal with (Intercept)
    vars$Variable<-gsub("\\(", "", vars$Variable)
    label<-deparse(substitute(lmer.name))   # identifier
    md<-data.frame(rep(label,length(lmer.name@fixef)))
    colnames(md)<-"Model"
    row.names(beta)<-NULL
    dff<-data.frame(cbind(md,vars,beta,se))
}
## controller
    lmer.append<-function(...,append=TRUE)  {
    label<<-deparse(substitute(...))
    if (!append){
        L.stats<<-lmer.stats(...)
        L.ranef<<-lmer.ranef(...)
        L.fixef<<-lmer.fixef(...)
    } else {
        L.stats<<-rbind(L.stats, lmer.stats(...))
        L.ranef<<-rbind(L.ranef, lmer.ranef(...))
        L.fixef<<-rbind(L.fixef, lmer.fixef(...))
    }
}
弗里克先生

可能的是通过“ ...”参数让变量“ fall-though”f1进入f2

x=7
f1<-function(a){
    label<-deparse(substitute(a))
    cat("f1 value:",a,"\n")
    cat("f1 label:",label,"\n")
}

f2<-function(...) {
    label<-deparse(substitute(...))
    cat("f2 value:",eval(substitute(...)),"\n")
    cat("f2 label:",label,"\n")
    f1(...)
}
f2(x)

# f2 value: 7 
# f2 label: x 
# f1 value: 7 
# f1 label: x 

但这实际上取决于您为什么要有这种安排。一种更自然的方法可能是这样做

x=7
f1<-function(a, label=deparse(substitute(a))) {
    cat("f1 value:",a,"\n")
    cat("f1 label:",label,"\n")
}

f2<-function(b) {
    label<-deparse(substitute(b))
    cat("f2 value:",b,"\n")
    cat("f2 label:",label,"\n")
    f1(b, label)
}
f2(x)

哪个也返回

# f2 value: 7 
# f2 label: x 
# f1 value: 7 
# f1 label: x 

f1(x)仍返回

# f1 value: 7 
# f1 label: x 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章