R:为什么model.frame无法在函数循环中读取方程式?

时间:2018-11-19 20:16:50

标签: r

我创建了一个函数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

我已经使用了debugtraceback命令,并且执行了其他控制,而问题出在fm_ebp函数中。似乎model.frame无法正常工作,因为在将对象包含为字符串时发现了类似的错误。几天来我一直在尝试解决此问题,但没有成功。关于此事的任何见解将非常有用。提前致谢。

0 个答案:

没有答案