Ошибка компиляции кода C ++ в R с использованием пакета TMB - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь применить модель иерархической компенсации, написанную на 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, чтобы начать тестирование на случайной выборке школ.

Что я должен искать в коде отладки, чтобы я мог исправить эту ошибку компиляции?

Заранее спасибо за вашу помощь.

...