2017-02-22 39 views
0

При выполнении приведенного ниже кода возникает следующая ошибка. По-видимому, это связано с тем, что не назначены глобальные параметры, однако это создает проблему, когда ncfn и ncfp назначаются глобальными. Пожалуйста, вы можете помочьsimul() не может найти переменные в выражениях

#Install libraries 
library(MASS) 
library(actuar) 

#Set globals 
set.seed(1) 
sims<-10 

#Set claim frequency 
claim_freq_n<-5 
claim_freq_p<-0.5 

#Create function to simulate claim severity, set n globally as number of claims to generate, set m globally as parameters of severity distribution 
claimsev<-function(n,m) { 
    rep(100,n) #use for testing 
} 

#Create function to generate two tables, first table has all projected losses, second table has number of losses by simulation. 
SimX<-function(ncfn,ncfp,nyr) { 
    #sims = number of simulations 

    #The expressions for ms and mf are dependent on the parameters being set at global level, so need << assignment and removal at end of these global values 

    nodes <- list(year = nyr) 
    mf <- expression(year=rnbinom(ncfn,ncfp)) 
    ms <- expression(year=claimsev(global_m)) 
    pf <- simul(nodes, mf, ms) 

    #now clean up 
    rm(list=grep("glob", ls(1), value=T), envir=globalenv()) 

    #check 
    global_test<<-frequency(pf,classification=FALSE) 
    print(fm<-mean(frequency(pf,classification=FALSE))) 
    sf<-severity(pf, by = "year") #see severity claims by year 
    sn<-as.numeric(frequency(pf,classification=FALSE)) 

    return(list(sf$main,sn)) 
} 

#Apply per claim and policy deductibles and limits 
z<-SimX(claim_freq_n,claim_freq_p,sims) 

Ошибка в rnbinom (ncfn, ncfp, п = 10): объект «ncfn» не найден

+0

@JohnColeman это 'pf <- simul (nodes, mf, ms)'. Выражение оценивается, но оно не находит объекты. Возможно, обернуть все в 'eval()' поможет? –

ответ

1

В функции simul, наступает момент, когда они оценивают ваши выражения, которые вы пройти через

eval(Call) 

Поскольку они явно не указать среду, в которой оценить это выражение, оно вычисляется в среде функции simul, которая не содержит переменную ncfn. Эта переменная определяется в среде вашей функции SimX. Обратите внимание, что переменные не просматриваются в среде, где вызываются функции, а R лексически ограничено, поэтому переменные просматриваются в средах, где определены функции. Таким образом, simul не может найти значения ncfn.

Решение состоит в том, чтобы оценить эти параметры, прежде чем звонить по телефону simul. Вот один из способов

mf <- as.expression(c(year=bquote(rbindom(.(ncfn), .(ncfp))))) 
# or 
mf <- as.expression(c(year=substitute(rbindom(n, p), list(n=ncfn, p=ncfp)))) 

Это evaulate к

mf 
# expression(year = rbindom(5, 0.5)) 

, который затем безопасно перейти в simul() так нет переменных, которые должны быть рассмотрены до.

Вы бы сделали то же самое для ms. Не удалось проверить его, потому что global_m в вашем примере не определен

Смежные вопросы