Fortran子程序不可用于R程序包



我的一个旧项目开始展示一种新的行为,一种fortran可供R程序包使用的子程序不再可用可获得的该包在src/目录中同时包含C++和Fortran代码。显然,C++方法是可用的,但Fortran子程序却不可用。

你可以在我的github页

再现错误所需的细节如下

# Install the specific version of the sccm package (including dependencies)
devtools::install_github("dewittpe/sccm@72375b2f347667119215eab708ebdfdec78fdfb2")

我们从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")])

为了帮助说明这个问题,有一个C++方法来确定一个点位于多边形的内部。符号名称是CCD_ 2,如图所示,已加载

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

导致错误的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"

如果我使用.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)

这里有一些证据可以证明这些对象在共享对象

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

我不知道是什么导致了这个错误,也不知道如何修复它。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)                    

此外,我有下面的Makevars文件,它可能对此有贡献问题

system("cat ~/.R/Makevars")
## CC=ccache clang -Qunused-arguments
## CXX=ccache clang++ -Qunused-arguments
## CCACHE_CPP=yes

来自成功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)

通过.C调用的Fortran方法的注册方式是不正确的,因为它们被注册为可通过.Call调用。我不知道为什么会发生这种事。你可以按照Dirk在评论中的建议打开一个GitHub票证。最好用一个较小的例子。作为一种变通方法,我生成了一个单独的注册文件,并在包的dev分支中重新生成了RcppExports.cpp

tools::package_native_routine_registration_skeleton(".", con = "src/init.c")
Rcpp::compileAttributes()

安装软件包后,我从您的示例命令中得到以下错误消息:

> 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

我认为这是一种进步。

一般来说,你也可以考虑Rcpp邮件列表中的这个建议,可以将其扩展到.C:

  1. 不要使用。Fortran((。从C++调用Fortran代码,并让Rcpp属性创建。为您调用((语句

最新更新