Pet*_*ter 5 fortran r r-package
我的一个旧项目已经开始显示一个新的行为,一个已经可供R包使用的fortran子程序不再可用.该包在src/目录中包含C++和Fortran代码.显然C++方法可用,但Fortran子程序不可用.
您可以在我的github 页面上查看代码库 .
重现错误所需的细节如下
# Install the specific version of the sccm package (including dependencies)
devtools::install_github("dewittpe/sccm@72375b2f347667119215eab708ebdfdec78fdfb2")
Run Code Online (Sandbox Code Playgroud)
我们从sccm包和示例数据集加载共享对象.dyn.load(list.files(system.file("libs",package ="sccm"),full.names = TRUE))
# Example data set
data("HexagonalFish", package = "sccm")
hf_pg <- sccm::polygon(HexagonalFish[, c("x", "y")])
Run Code Online (Sandbox Code Playgroud)
为了帮助说明这个问题,有一种C++方法可以确定一个点是否在多边形的内部.符号名称是_sccm_is_in_cpp和,如此处所示,已加载
is.loaded("_sccm_is_in_cpp")
# [1] TRUE
.Call("_sccm_is_in_cpp", PACKAGE = "sccm", 0.2, 0.4, hf_pg$vertices) # expect 0
## [1] 0
.Call("_sccm_is_in_cpp", PACKAGE = "sccm", 156, 178, hf_pg$vertices) # expect 1
## [1] 1
Run Code Online (Sandbox Code Playgroud)
导致错误的Fortran子程序之一是:scmap_.但是,符号已加载.
is.loaded("scmap_")
## [1] TRUE
# need values for the .Fortran call below
n <- nrow(hf_pg$vertices)
betam <- -hf_pg$beta/pi
w <- as.vector(t(hf_pg$vertices))
wc <- colMeans(hf_pg$vertices)
nptsq <- 12
.Fortran(
"scmap_", n = as.integer(n), w = as.double(w), wc = as.double(wc),
betam = as.double(betam), nptsq = as.integer(nptsq),
tol = double(1), errest = double(1), c = double(2), z = double(2 * n),
qwork = double(nptsq * (2 * n + 3)),
PACKAGE = "sccm")
## Error in .Fortran("scmap_", n = as.integer(n), w = as.double(w), wc = as.double(wc), :
## "scmap_" not available for .Fortran() for package "sccm"
Run Code Online (Sandbox Code Playgroud)
如果我使用.C或,错误是相同的.Fortran. .Call我认为在这种情况下不适合使用,会导致分段错误.
可以在调用中找到包中方法的使用 scmap
sccm::scmap(hf_pg)
## Error in .C("scmap_", n = as.integer(n), w = as.double(w), wc = as.double(wc), :
## "scmap_" not resolved from current namespace (sccm)
Run Code Online (Sandbox Code Playgroud)
只是为了迂腐,这里有一些证据证明对象在共享对象中.
system(sprintf("nm -g %s | grep -P 'is_in|scmap'",
list.files(system.file("libs", package = "sccm"),
full.names = TRUE)))
## 000000000000afb0 T _sccm_is_in_cpp
## 000000000001c400 T scmap_
## 0000000000014550 T _Z9is_in_cppN4Rcpp6VectorILi14ENS_15PreserveStorageEEES2_NS_6MatrixILi14ES1_EE
Run Code Online (Sandbox Code Playgroud)
我不明白是什么原因导致此错误或如何尝试修复它.一个成功的构建,包括可能引发此错误的测试,在Travis-ci.org中完成.
我当前的会话信息
devtools::session_info()
## Session info ---------------------------------------------------------
## setting value
## version R version 3.5.1 (2018-07-02)
## system x86_64, linux-gnu
## ui X11
## language (EN)
## collate en_US.UTF-8
## tz America/Denver
## date 2018-07-17
##
## Packages ------------------------------------------------------------
## package * version date source
## base * 3.5.1 2018-07-12 local
## colorout * 1.2-0 2018-07-12 Github (jalvesaq/colorout@cc5fbfa)
## compiler 3.5.1 2018-07-12 local
## datasets * 3.5.1 2018-07-12 local
## devtools 1.13.6 2018-06-27 CRAN (R 3.5.1)
## digest 0.6.15 2018-01-28 CRAN (R 3.5.1)
## graphics * 3.5.1 2018-07-12 local
## grDevices * 3.5.1 2018-07-12 local
## memoise 1.1.0 2017-04-21 CRAN (R 3.5.1)
## methods * 3.5.1 2018-07-12 local
## nvimcom * 0.9-64 2018-07-12 local
## Rcpp 0.12.17 2018-05-18 cran (@0.12.17)
## sccm 0.1.2 2018-07-17 Github (dewittpe/sccm@72375b2)
## stats * 3.5.1 2018-07-12 local
## tools 3.5.1 2018-07-12 local
## utils * 3.5.1 2018-07-12 local
## withr 2.1.2 2018-03-15 CRAN (R 3.5.1)
Run Code Online (Sandbox Code Playgroud)
另外,我有以下Makevars文件可能导致此问题.
system("cat ~/.R/Makevars")
## CC=ccache clang -Qunused-arguments
## CXX=ccache clang++ -Qunused-arguments
## CCACHE_CPP=yes
Run Code Online (Sandbox Code Playgroud)
来自成功的Travis-ci.org的会话信息是
Session info
-------------------------------------------------------------------
setting value
version R version 3.3.2 (2016-10-31)
system x86_64, linux-gnu
ui X11
language (EN)
collate en_US.UTF-8
tz <NA>
date 2017-02-22
Packages -----------------------------------------------------------------------
package * version date source
assertthat 0.1 2013-12-06 cran (@0.1)
backports 1.0.5 2017-01-18 cran (@1.0.5)
base64enc 0.1-3 2015-07-28 cran (@0.1-3)
BH 1.62.0-1 2016-11-19 cran (@1.62.0-)
bitops 1.0-6 2013-08-17 cran (@1.0-6)
boot 1.3-18 2016-02-23 CRAN (R 3.3.2)
caTools 1.17.1 2014-09-10 cran (@1.17.1)
class 7.3-14 2015-08-30 CRAN (R 3.3.2)
cluster 2.0.5 2016-10-08 CRAN (R 3.3.2)
codetools 0.2-15 2016-10-05 CRAN (R 3.3.2)
covr 2.2.2 2017-01-05 cran (@2.2.2)
crayon 1.3.2 2016-06-28 cran (@1.3.2)
curl 2.3 2016-11-24 CRAN (R 3.3.2)
DBI 0.5-1 2016-09-10 cran (@0.5-1)
devtools 1.12.0 2016-12-05 CRAN (R 3.3.2)
digest 0.6.12 2017-01-27 CRAN (R 3.3.2)
dplyr 0.5.0 2016-06-24 cran (@0.5.0)
evaluate 0.10 2016-10-11 cran (@0.10)
foreign 0.8-67 2016-09-13 CRAN (R 3.3.2)
git2r 0.18.0 2017-01-01 CRAN (R 3.3.2)
highr 0.6 2016-05-09 cran (@0.6)
htmltools 0.3.5 2016-03-21 cran (@0.3.5)
httr 1.2.1 2016-07-03 CRAN (R 3.3.2)
jsonlite 1.2 2016-12-31 CRAN (R 3.3.2)
KernSmooth 2.23-15 2015-06-29 CRAN (R 3.3.2)
knitr 1.15.1 2016-11-22 cran (@1.15.1)
lattice 0.20-34 2016-09-06 CRAN (R 3.3.2)
lazyeval 0.2.0 2016-06-12 cran (@0.2.0)
magrittr 1.5 2014-11-22 cran (@1.5)
markdown 0.7.7 2015-04-22 cran (@0.7.7)
MASS 7.3-45 2016-04-21 CRAN (R 3.3.2)
Matrix 1.2-7.1 2016-09-01 CRAN (R 3.3.2)
memoise 1.0.0 2016-01-29 CRAN (R 3.3.2)
mgcv 1.8-15 2016-09-14 CRAN (R 3.3.2)
mime 0.5 2016-07-07 CRAN (R 3.3.2)
nlme 3.1-128 2016-05-10 CRAN (R 3.3.2)
nnet 7.3-12 2016-02-02 CRAN (R 3.3.2)
openssl 0.9.6 2016-12-31 CRAN (R 3.3.2)
praise 1.0.0 2015-08-11 cran (@1.0.0)
R6 2.2.0 2016-10-05 CRAN (R 3.3.2)
Rcpp 0.12.9 2017-01-14 cran (@0.12.9)
RcppArmadillo 0.7.700.0.0 2017-02-08 cran (@0.7.700)
rex 1.1.1 2016-12-05 cran (@1.1.1)
rmarkdown 1.3 2016-12-21 cran (@1.3)
rpart 4.1-10 2015-06-29 CRAN (R 3.3.2)
rprojroot 1.2 2017-01-16 cran (@1.2)
rstudioapi 0.6 2016-06-27 CRAN (R 3.3.2)
spatial 7.3-11 2015-08-30 CRAN (R 3.3.2)
stringi 1.1.2 2016-10-01 cran (@1.1.2)
stringr 1.1.0 2016-08-19 cran (@1.1.0)
survival 2.39-5 2016-06-26 CRAN (R 3.3.2)
testthat 1.0.2 2016-04-23 cran (@1.0.2)
tibble 1.2 2016-08-26 cran (@1.2)
whisker 0.3-2 2013-04-28 CRAN (R 3.3.2)
withr 1.0.2 2016-06-20 CRAN (R 3.3.2)
yaml 2.1.14 2016-11-12 cran (@2.1.14)
Run Code Online (Sandbox Code Playgroud)
通过 调用的 Fortran 方法的注册方式.C不正确,因为它们被注册为可通过 调用.Call。我不知道为什么会发生这种情况。您可以按照 Dirk 在评论中的建议打开 GitHub 票证。最好有一个较小的例子。作为解决方法,我生成了一个单独的注册文件并RcppExports.cpp在dev包的分支中重新生成:
tools::package_native_routine_registration_skeleton(".", con = "src/init.c")
Rcpp::compileAttributes()
Run Code Online (Sandbox Code Playgroud)
安装该软件包后,我从您的示例命令中收到此错误消息:
> data("HexagonalFish", package = "sccm")
> hf_pg <- sccm::polygon(HexagonalFish[, c("x", "y")])
> sccm::scmap(hf_pg)
*** error in check: angles do not add up to 2
*** error in check: w(1) must be finite
Run Code Online (Sandbox Code Playgroud)
我认为这是一种进步。
一般来说,您也可以考虑Rcpp 邮件列表中的这一建议,该列表可以扩展到.C:
- 不要使用 .Fortran()。从 C++ 调用 Fortran 代码,并让 Rcpp 属性为您创建 .Call() 语句。