2016-12-13 6 views
1

У меня возникают трудности с написанием функции «обертка», которая должна принимать все аргументы для существующей функции плюс один дополнительный аргумент, а затем выполнять некоторые вычисления на этот дополнительный аргумент, передать все исходной функции и вернуть результат.Ошибка в eval (expr, envir, cover): объект не найден

Насколько я понимаю, проблема в том, что функция, которую я пытаюсь «обернуть», не ищет аргумент, который я пытаюсь передать в локальной среде, но в глобальной среде. Я не знаю, как решить эту проблему.

Ниже приведен мой заголовок с минимальным кодом, который воспроизводит ошибку. В этом примере я не выполняю никаких вычислений в аргументе passtheseweights, потому что я не думаю, что вычисления релевантны для вопроса.

require(rpart) 
df<-car.test.frame 
wt<-runif(nrow(df)) 
wt<-wt/sum(wt) 

df<-data.frame(df, wt) 

#Attempt 1 
wrapfun<-function(formula, data, passtheseweights, ...) 
{ 
    print(passtheseweights) 
    outputmodel<-rpart(formula=formula, data=data, weights=passtheseweights, ...) 
    return(outputmodel) 
} 

wrapfun(Price~Country + Reliability + Mileage + Type + Weight + Disp. + HP, data=df, passtheseweights=df$wt, method="anova", minsplit=4) 

#Attempt 2 
wrapfun<-function(formula, data, passtheseweights, ...) 
{ 
    print(data[,passtheseweights]) 
    outputmodel<-rpart(formula=formula, data=data, weights=data[,passtheseweights], ...) 
    return(outputmodel) 
} 

wrapfun(Price~Country + Reliability + Mileage + Type + Weight + Disp. + HP, data=df, passtheseweights="wt", method="anova", minsplit=4) 

#Attempt 3, this is working.... 
wrapfun<-function(formula, data, passtheseweights, ...) 
{ 
    print(passtheseweights) 
    outputmodel<-rpart(formula=formula, data=data, weights=passtheseweights, ...) 
    return(outputmodel) 
} 

wt<-df$wt 
wrapfun(Price~Country + Reliability + Mileage + Type + Weight + Disp. + HP, data=df, passtheseweights=wt, method="anova", minsplit=4) 

#But only because the function uses wt from the global environment. The same example also works if no passtheseweights argument is passed 
wrapfun<-function(formula, data, ...) 
{ 
    print(passtheseweights) 
    outputmodel<-rpart(formula=formula, data=data, weights=passtheseweights, ...) 
    return(outputmodel) 
} 

passtheseweights<-df$wt 
wrapfun(Price~Country + Reliability + Mileage + Type + Weight + Disp. + HP, data=df, method="anova", minsplit=4) 

Если кто-нибудь знает, как я могу заставить rpart искать passtheseweights локально, ваша помощь будет чрезвычайно признателен!

Бест, CJ

+0

Вы пробовали http://stackoverflow.com/a/22260104/6455166? –

+0

Спасибо! Я прочитал несколько вопросов, относящихся к этому сообщению об ошибке, но, похоже, имел другую причину. Спасибо, что предупредили меня об этом вопросе, который явно затрагивает ту же проблему. –

ответ

0

Вы можете использовать do.call:

wrapfun<-function(formula, data, passtheseweights, ...) 
{ 
    outputmodel <- do.call(rpart, list(formula=formula, data=data, weights=passtheseweights, ...)) 
    return(outputmodel) 
} 
wrapfun(Price~Country + Reliability + Mileage + Type + Weight + Disp. + HP, 
     data=df, passtheseweights=df$wt, method="anova", minsplit=4) 
+0

Это прекрасно работает, большое вам спасибо! Я исправлю это, потому что do.call имеет параметр по умолчанию «envir = parent.frame()», из-за чего do.call ищет все аргументы в среде моей функции wrapfun? –

+0

Я не уверен. Я скорее верю, что он работает, потому что все аргументы (включая формулу) оцениваются вместе в одной и той же среде при создании списка. – Roland