Я пытаюсь применить модель иерархической компенсации, написанную на C ++, которая была разработана коллегой несколько лет назад.Я пытаюсь использовать пакет TMB для компиляции кода, а затем применить модель к некоторым данным об образовании, которые я извлек из BLS и внутренней базы данных.
Однако, когда я использовал функцию компиляции в TMB, я получаюследующее во время работы в R версии 3.6.0
Error in compile("hierarchical_earnings_model.cpp") : Compilation failed
Я пытался использовать функцию отладки с компиляцией, чтобы увидеть, что происходит, чтобы вызвать эту ошибку, но я боюсь, что мои знания R слишком низки, чтобы понять отладкуРезультаты.
debug(compile('hierarchical_earnings_model.cpp'))
debugging in: compile("hierarchical_earnings_model.cpp")
debug: {
if (.Platform$OS.type == "windows") {
system.file <- function(...) {
ans <- base::system.file(...)
chartr("\\", "/", shortPathName(ans))
}
}
if (tracesweep)
libtmb <- FALSE
debug <- length(grep("-O0", flags)) && length(grep("-g",
flags))
fpath <- system.file(paste0("libs", Sys.getenv("R_ARCH")),
package = "TMB")
f <- paste0(fpath, "/libTMB", if (openmp)
"omp"
else if (debug)
"dbg", ".cpp")
libtmb <- libtmb && file.exists(f)
if (libtmb)
file <- c(file, f)
oldmvuser <- mvuser <- Sys.getenv("R_MAKEVARS_USER",
NA)
if (is.na(oldmvuser)) {
on.exit(Sys.unsetenv("R_MAKEVARS_USER"))
}
else {
on.exit(Sys.setenv(R_MAKEVARS_USER = oldmvuser))
}
if (is.na(mvuser) && file.exists(f <- path.expand("~/.R/Makevars")))
mvuser <- f
if (!is.na(mvuser)) {
cat("Note: Using Makevars in", mvuser, "\n")
}
makevars <- function(...) {
file <- tempfile()
args <- unlist(list(...))
txt <- paste(names(args), args, sep = "=")
if (!is.na(mvuser)) {
if (file.exists(mvuser)) {
txt <- c(readLines(mvuser), txt)
}
}
writeLines(txt, file)
Sys.setenv(R_MAKEVARS_USER = file)
file
}
libname <- sub("\\.[^\\.]*$", "", basename(file[1]))
if (safeunload) {
valid <- c(letters[1:26], LETTERS[1:26], 0:9, "_")
invalid <- setdiff(unique(strsplit(libname, "")[[1]]),
valid)
if (length(invalid) > 0) {
cat("Your library name has invalid characters:\n")
print(invalid)
cat("It is recommended to replace invalid characters by underscore.\n")
cat("Alternatively compile with safeunload=FALSE (not recommended).\n")
stop()
}
}
if (.Platform$OS.type == "windows") {
tr <- try(dyn.unload(dynlib(libname)), silent = TRUE)
if (!is(tr, "try-error"))
cat("Note: Library", paste0("'", dynlib(libname),
"'"), "was unloaded.\n")
}
useRcppEigen <- !file.exists(system.file("include/Eigen",
package = "TMB"))
useContrib <- file.exists(system.file("include/contrib",
package = "TMB"))
ppflags <- paste(paste0("-I", system.file("include",
package = "TMB")), paste0("-I", system.file("include",
package = "RcppEigen"))[useRcppEigen], paste0("-I",
system.file("include/contrib", package = "TMB"))[useContrib],
"-DTMB_SAFEBOUNDS"[safebounds], paste0("-DLIB_UNLOAD=R_unload_",
libname)[safeunload], "-DWITH_LIBTMB"[libtmb],
paste0("-DTMB_LIB_INIT=R_init_", libname)[libinit],
"-DCPPAD_FORWARD0SWEEP_TRACE"[tracesweep])
mvfile <- makevars(PKG_CPPFLAGS = ppflags, PKG_LIBS = paste("$(SHLIB_OPENMP_CXXFLAGS)"[openmp]),
PKG_CXXFLAGS = "$(SHLIB_OPENMP_CXXFLAGS)"[openmp],
CXXFLAGS = flags[flags != ""], ...)
on.exit(file.remove(mvfile), add = TRUE)
status <- .shlib_internal(file)
if (status != 0)
stop("Compilation failed")
status
}
Browse[2]> c
Error in compile("hierarchical_earnings_model.cpp") : Compilation failed
В идеале код должен компилироваться, и тогда я мог бы загрузить модель с помощью dyn.load, прежде чем начать использовать данные BLS, чтобы начать тестирование на случайной выборке школ.
Что я должен искать в коде отладки, чтобы я мог исправить эту ошибку компиляции?
Заранее спасибо за вашу помощь.