代码之家  ›  专栏  ›  技术社区  ›  Peter

Fortran子程序不可用于R包

  •  5
  • Peter  · 技术社区  · 6 年前

    我的一个老项目已经开始显示出新的行为,一个堡垒 R包已不再使用的子程序 可用。包中既有C++又有FORTRAN代码。 src/ 目录。 显然,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.name=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 回复  |  直到 6 年前
        1
  •  1
  •   Ralf Stubner    6 年前

    Fortran方法的调用方式 .C , are registered 不正确,因为它们注册为可通过 .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()语句。