Я создал функцию 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
не работает, так как я обнаружил похожие ошибки при включении объекта в виде строки.Я пытался решить эту проблему в течение нескольких дней, и я не добился успеха.Любые идеи по этому вопросу будут очень полезны.Заранее спасибо.