我已经有一些函数可以操作同一对象的名称和其他属性。虽然他们单独运作良好,但我在编写"控件"这会在一次行动中将论证传递给所有人。
到目前为止,我已将问题缩小到论点的名称。为了说明,下面的简化代码显示了从"控件"传递名称的失败。 (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和名称&#34; x&#34;表示。但是当在f2中调用f1时,我只能传递对象x的值,而不是名称。如果我错了,请纠正我,但我的理解是,f1只能看到名称&#34; b&#34;和价值7通过论证。
是否有办法让f1读取&#34; x&#34;的名称和值。在这个例子中?我是R的新手,并试图运用我对环境,评估和电话的半生不熟的理解无济于事。我找到的唯一解决方案是使用assign&#34; label&#34;作为全球的f2到&lt;&lt; - ,这远非理想。
提前感谢任何输入。
已编辑:完整更正的代码
感谢MrFlick的建议。这是我试图解决的实际问题的代码(现已修复)。由于我是R的新手,我仍然很欣赏有关更好的方法的建议。
基本上我估计了几十个lmer
(.99x版本的lme4
包)模型,并且最终会将相关输出聚合到Excel文件中。在下面的代码中,lmer.stats
,lmer.fixef
和lmer.ranef
都会根据相应的结果创建数据框。 lmer.append
用于调用三个函数并rbind
结果。
由于模型太多,我需要创建一个额外的id变量 label ,以便在聚合输出中告诉另一个模型。我的想法是提取参数名称并使其成为标识符变量,直到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(...))
}
}
答案 0 :(得分:1)
可能性是让变量&#34;跌倒 - 然而#34; f1
f2
通过&#34; ...&#34;参数。
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