我创建了一个函数fm_ebp
,该函数根据给定的参数创建了一个方程式。我已经测试了该函数,并且可以正常工作,但是当我在for循环中使用它时,似乎model.frame
无法正常工作,因为显示了我的信息,并且关于不存在的对象的错误(当它们存在时)。我只是在学习用R编程,所以我的错误可能很基本。在以下几行中,我将重现一个简单的例子来阐明我的问题:
`sessionInfo()`
R版本3.5.1(2018-07-02);平台:x86_64-w64-mingw32 / x64(64位);在以下环境下运行:Windows> = 8 x64(内部版本9200)
library(data.table)
set.seed(123)
使用的功能:
功能1:此功能仅在数据少于2个数据点时缩放数据。这对我的问题很有用。
scale_con<-function(x){
if(length(x)>1){scale(x)}
else x
}
函数2:此函数生成我计算所需的公式。该函数的输出是一个公式对象。
fm_ebp<-function(X,dt,bt){
n=length(X)
f=numeric(length = 0)
for(i in 1:n){
if(length(grep("\\(",X[i]))>0){
y=gsub("\\(|\\)|scale","",X[i])
y1=paste0("scale_con(",dt,"$",y,")","+")
}else {
y=X[i]
y1=paste0(dt,"$",X[i],"+")
}
postt=grep(y,names(eval(parse(text=bt))))
f=paste0(f,bt,"[", postt,"]","*",y1)
}
f=paste0("~I(",bt,"[1]","+",f,"phi*vv[s]",")")
return(as.formula(f))
}
该功能有效:
一些论点
X=c("d1","scale(x)")
dt="datd"
beta=c("(intercept)"=-.8,"scale(x)"=0.5,"d1"=.2)
bt="beta"
所以fm_ebp(X=X,dt=dt,bt=bt)
给出:
~I(beta[1] + beta[3] * datd$d1 + beta[2] * scale_con(datd$x) +
phi * vv[s])
<environment: 0x000000000524a2c0>
现在让我们尝试一些数据(我在项目中使用data.table
):
dat=data.frame(y=rbinom(200,1,.2),x1=rnorm(200),d1=rbinom(200,1,.5),
sample1=rbinom(200,1,.2),dom=c(rep("g1",round(200/3)),rep("g2",round(200/3)),
rep("g3",round(200/3)-1)))
dat=data.table(dat)
phi=.5
该函数的参数
X=c("d1","scale(x)")
S=2
SS<-2*S # Monte-Carlo
a2<-rep(0,SS)
v<-rnorm(n=S,mean=0,sd=1)
vv<-c(v,-v)
s=1
然后,如果我使用as.double(model.frame(fm_ebp(X=X,dt="dat",bt="beta"))[,1])[1:3]
我得到-1.4732023 -0.7709053 -1.2324033
但是,当我在以下函数的上下文中应用fm_ebp
时,会出现错误:
fnc_ebp1<-function(datname,S=2,mtname,domname){
dominios=sort(unique(get(datname)[get(mtname)==1,get(domname)]))
ndom<-length(dominios)
SS<-2*S # Monte-Carlo
a2<-rep(0,SS)
v<-rnorm(n=S,mean=0,sd=1)
vv<-c(v,-v)
den<-dominios
ebpmudesn<-dominios; ebpmubardesn<-dominios
for (d in 1:ndom) {
datd<-get(datname)[get(domname)==dominios[d]]
ndatd<-nrow(datd)
datd<-datd[get(mtname) == "0"]
ndatd1<-nrow(datd)
datdm<-get(datname)[get(domname)== dominios[d] & get(mtname) == 1]
for (s in 1:SS) {
return(as.double(model.frame(fm_ebp(X=X,dt="datd",bt="beta"))[,1])[1:3])
}
}
}
一些参数:
datname="dat"
mtname="sample1"
domname="dom"
然后我使用fnc_ebp1
,并得到:
fnc_ebp1(datname=datname,mtname=mtname,domname=domname)
Error in structure(x, class = unique(c("AsIs", oldClass(x)))) :
object 'datd' not found
我已经使用了debug
和traceback
命令,并且执行了其他控制,而问题出在fm_ebp
函数中。似乎model.frame
无法正常工作,因为在将对象包含为字符串时发现了类似的错误。几天来我一直在尝试解决此问题,但没有成功。关于此事的任何见解将非常有用。提前致谢。