Fortran子例程不适用于R软件包

时间:2018-07-17 18:37:15

标签: r fortran r-package

我的一个旧项目已开始显示新行为,即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 ++方法可确定是否存在点 在多边形的内部。符号名称为_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

引起错误的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)

1 个答案:

答案 0 :(得分:1)

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

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 mailing list的建议,该建议可以扩展到.C

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