Как посмотреть и скопировать конфигурацию Makevars R по умолчанию?
У меня нет ~/.R/Makevars
файл и
> tools::makevars_user()
character(0)
> tools::makevars_site()
character(0)
Еще, R
должен читать конфигурацию откуда-то как .cpp
файлы, содержащие Rcpp
экспорт в упаковке src
Подкаталог компилируется нормально.
Мне интересно знать, как написать Makefile.win
в src
каталог, так что Rcpp
файлы продолжают компилироваться вместе с TMB
.cpp
файлы. В настоящее время make-файл похож на:
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
предложенный Дирком здесь, но не было удачи повторить 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
1 ответ
Я до сих пор не знаю, как использовать Makevars
делать то, что я хочу, что по существу:
- Сделать нормальный по умолчанию
make
в Rstudio (Windows 7) черезBuild and Reload
пакет для всехRcpp
экспортировать файлы. Под капотом это называетRcpp::compileAttributes()
затем приступает к выполнению других команд построения пакетов. - Сделать другое
make
используя RstudioBuild 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
в каталог установки пакета.
Обратите внимание, что это возможно, но возможно очень сложно в использовании Makevars
чтобы выполнить компиляцию, когда файлы TMB хранятся в подкаталоге. Дирк порекомендовал пример из пакета матрицы, но мне не повезло, что я изменил код там, чтобы сделать то, что я хочу.