2014-09-08 2 views
3

Может кто-то, пожалуйста, помогите мне понять, почему моя программа производит эту ошибку?Ошибка экспорта кластера R "объект не найден"

Как видно здесь, «pay.freq» явно является частью окружающей среды, поэтому почему он не может найти его? Синтаксис такой же, как и для «ts», который он может найти без проблем

Большой круг частично раскрывает функцию слова, маленький круг частично покрывает слово сюжет.

Screenshot of error

cf.pro <- function(t=0,Tb=T,r=Y, k=1, PRFlag="P", freq="w",plot=0){ #Beregner exposure for alle tidspunkter med udgangspunkt 
    ts <- seq(0,30,1/52) 
    pay.freq <- if(toupper(freq)=="W"){1}else #bestemmer hvor ofte der sker betalinger 
    if(toupper(freq)=="Q"){13}else 
     if(toupper(freq)=="H"){26}else 
     if(toupper(freq)=="Y"){52}else print("Fejl i frequency input") 

    library('parallel') 
    cl <- makeCluster(7) 
    clusterEvalQ(cl,source("C:/Users/Marcus/Documents/CBS/Speciale/Data/Global data.R")) 
    clusterEvalQ(cl,source("C:/Users/Marcus/Documents/CBS/Speciale/Data/Swappriser.R")) 
    clusterEvalQ(cl,source("C:/Users/Marcus/Documents/CBS/Speciale/Data/Interest simulation.R")) 
    clusterEvalQ(cl,source("C:/Users/Marcus/Documents/CBS/Speciale/Data/Survival sim.R")) 
    clusterEvalQ(cl,source("C:/Users/Marcus/Documents/CBS/Speciale/Data/Exposures.R")) 
    clusterExport(cl,"ts") 
    clusterExport(cl,"pay.freq") 

cf.pro <- parSapplyLB(cl,1:n, function(j){ #Beregner exposure serie n gange 
    if (k==1) k=Swap(t=0,Ta=0,Tb=Tb,r=r[,j]) 
    sapply(ts,function(i){Exposure.cf(t=i,Tb=Tb,r=r[,j], k=k, PRFlag=PRFlag, pay.freq=pay.freq)}) #beregner exposure for alle tidspunkter 
    }) 
    stopCluster(cl) 

    if (plot==1) { 
    tss <- seq(t, Tb, dt) 
    matplot(tss, cf.pro[,1:n], type="l", lty=1, main="Exposure Profiles", ylab="Exposure") 
    lines(tss,rowMeans(cf.pro), lty=1, lwd=3) 
    } 
    return(cf.pro) 
} 

CF.pro.w=cf.pro(t=0,Tb=T,r=r, PRFlag="P", freq="w", plot=1) 

ответ

5

Если вы посмотрите на документацию clusterExport вызов заключается в следующем

clusterExport(cl, varlist, envir = .GlobalEnv) 

Как вы можете видеть, окружающая среда по умолчанию, чтобы искать переменную, которую вы пытаетесь экспорт - .GlobalEnv.

Вы выполняете экспорт внутри функции, а область действия pay.freq не является глобальным, а локальной средой функции. Однако вы не указали среду функции для clusterExport, поэтому clusterExport ищет GlobalEnv и не находит pay.freq.

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

Дайте мне знать, как это происходит, и мы можем работать через него, если проблема немного более тонкая. Это была моя первая мысль рассмотреть этот вопрос.

+2

Мои мысли в точности, но тогда это странно, что ClusterExport (cl, «ts») не вызывает ошибку, поскольку он также существует только в среде функций. Я изменил его на ClusterExport (cl, list ("ts", "pay.freq"), envir = environment()) и, похоже, сработает. – Marcus

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