4

我没有~/.R/Makevars文件并且

> tools::makevars_user()
character(0)
> tools::makevars_site()
character(0)

然而,R必须从某个地方读取配置,因为包子目录.cpp中包含Rcpp导出的文件src可以正常编译。

我很想知道如何Makefile.winsrc目录中编写 a 以便Rcpp文件与文件一起继续编译TMB .cpp。目前一个makefile像:

all: fn1.dll fn2.dll

fn1.dll: fn1.cpp
    Rscript --vanilla -e "TMB::compile('fn1.cpp')"

fn2.dll: fn2.cpp
    Rscript --vanilla -e "TMB::compile('fn2.cpp')"

clean:
    rm -rf *o

可以很好地编译TMB文件,实际上是由以下建议的:https ://github.com/kaskr/adcomp/issues/43

我试图在此处makefile修改Dirk 的建议,但即使使用全新的测试包也无法复制' 的默认行为。R

我的会话信息:

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
4

1 回答 1

0

我仍然不知道如何使用Makevars来做我想做的事,本质上是:

  1. 通过包为所有导出文件make在 Rstudio (Windows 7) 中执行正常默认设置。在后台,此调用然后继续运行其他包构建​​命令。Build and ReloadRcppRcpp::compileAttributes()
  2. make使用 Rstudio做另一个Build and Reload,除了现在它读取的Makefile只是编译TMB代码。

但是,我确实有一个解决方法。本质上,R 扩展手册指出:

可以使用以下 `src/install.libs.R' 文件复制接近默认行为的内容:

...

由于编译TMB .cpp文件的代码只是R命令,因此很容易将它们集成到这样的文件中:

# replicate default R
files <- Sys.glob(paste("*", SHLIB_EXT, sep=''))
libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
dest <- file.path(R_PACKAGE_DIR, libarch)
dir.create(dest, recursive = TRUE, showWarnings = FALSE)
file.copy(files, dest, overwrite = TRUE)

# now do TMB files
cpp_files <- list.files('./TMB/', full.names = T, pattern = '*.cpp')

for (f in cpp_files) {
    TMB::compile(f)
}

files <- Sys.glob(paste("./TMB/*", SHLIB_EXT, sep=''))
libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
dest <- file.path(R_PACKAGE_DIR, libarch)
dir.create(dest, recursive = TRUE, showWarnings = FALSE)
file.copy(files, dest, overwrite = TRUE)

该文件读取并编译所有TMP类型.cpp文件,存放在子目录<pkgdir>/src/TMB下,然后将后续.dll的所有文件复制<pkgdir>/src/<pkgdir>/src/TMB包的安装目录中。

请注意,当 TMB 文件存储在子目录中时,它是可能的,但可能很难完成编译。MakevarsDirk 推荐了矩阵包中的示例,但我没有运气修改那里的代码来做我想做的事。

于 2017-10-24T21:14:54.723 回答