Ошибка Монте-Карло и rstudio: NA / NaN / Inf при вызове сторонней функции (аргумент 5) - PullRequest
0 голосов
/ 23 ноября 2018

Это будет трудно скопировать, потому что я использую пакет R Монте-Карло для вызова подпрограммы Fortran в RStudio, и я не включаю эту подпрограмму здесь, потому что она сложная.В любом случае, мой код, приведенный ниже, завершается с ошибкой перед входом в эту подпрограмму (я думаю).Вот код:

#####Monte Carlo
rsentTinitial=10
rTinitial=15
res_presets = character(0)
res_presets[1] = 'win' 
res_presets2 = eval(parse(text = "res_presets[1]", encoding = "UTF-8"))
noquote(res_presets2)
ntimestep<-c(264)
mySENSRange2 <- function(irflag,rricomp,rrrandom,res_presets2,rtairsent2, rtairback2, irrtimestep) {
  if (!is.loaded('rwrapper')) {
      dyn.load("rwrapper.so")
  }
  retvals <- .Fortran("RSENSRANGE",irflag = as.integer(irflag), icomp = as.integer(rricomp),
                      rCOUPLEVAR = as.numeric(rrrandom), noquote(res_presets2), rtairsent2 = as.array(rtairsent2[1:ntimestep]),
                      rtairback2 = as.array(rtairback2[1:ntimestep]),irrtimestep = as.integer(irrtimestep))
  rmonteresult<-return(list("sentTemps"=retvals$rtairsent2,"CalcTemps"=retvals$rtairback2, "Timesteps"=retvals$irrtimestep))
}
library(MonteCarlo)
irflag_grid<-c(1)
rricomp_grid<-c(1) #Hardwiring for now
rrrandom_grid<-seq(1,2,0.2)
res_presets2_grid<-c(noquote(res_presets2))
rtairsent_grid<-c(data.frame(matrix(1: ntimestep),rsentTinitial))
names(rtairsent_grid)<-c("Timestep","AirTemp")
rtairback_grid<-c(data.frame(matrix(1:ntimestep),rTinitial))
names(rtairback_grid)<-c("Timestep","AirTemp")
irrtimestep_grid<-c(ntimestep)

param_list=list("irflag"=irflag_grid, "rricomp"=rricomp_grid, "rrrandom"=rrrandom_grid,"res_presets2"=as.character(noquote(res_presets2_grid)),
                "rtairsent2"=rtairsent_grid$AirTemp[1:ntimestep],"rtairback2"=rtairback_grid$AirTemp[1:ntimestep],"irrtimestep"=irrtimestep_grid)
monteResult<-MonteCarlo(func=mySENSRange2, nrep=20, param_list=param_list, ncpus=1)
df<-MakeFrame(list(CalcTemps,sentTemps,Timesteps))

и вот ошибки:

Error in func(irflag = param_list[[1]][1], rricomp = param_list[[2]][1],  : 
  NA/NaN/Inf in foreign function call (arg 5)

А также из последней строки кода (строка Makeframe) я получаю это:

Error in MakeFrame(list(CalcTemps, sentTemps, Timesteps)) : 
  object 'CalcTemps' not found

Для первой ошибки кажется, что у меня может быть NaN или что я где-то делю на ноль, но я просто не могу этого увидеть.Будем очень благодарны за любые предположения о том, что может пойти не так.Благодаря.

1 Ответ

0 голосов
/ 10 декабря 2018

Я кратко отвечу на мой вопрос, если он кому-нибудь пригодится.

Вышеприведенная ошибка MakeFrame была решена с помощью:

df<-MakeFrame(monteResult)

Ошибка NA / NaN / Inf была вызвана тем, чтоПакет Монте-Карло принимает скалярные входы, а не массивы.Поэтому я просто отправляю скаляр в свою функцию и в своей функции я использовал третью переменную, чтобы подготовить массив для вызова моей функции после подпрограммы fortran.Код немного длинный, поэтому я сохраняю его чистым, я не буду загружать его (но с удовольствием отправлю его кому-либо).

...