gpt4 book ai didi

r - Fortran 子例程不适用于 R 包

转载 作者:行者123 更新时间:2023-12-03 02:55:35 24 4
gpt4 key购买 nike

我的一个旧项目已经开始表现出新的行为,一个 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 中完成了一次成功的构建,其中包括可能引发此错误的测试。 。

我当前的 session 信息

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

成功的 session 信息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)

最佳答案

Fortran方法的方式,通过.C调用,are registered不正确,因为它们被注册为可通过 .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 mailing list 中的建议,它可以扩展为 .C:

  1. Don't use .Fortran(). Call the Fortran code from C++, and let Rcpp attributes create the .Call() statements for you.

关于r - Fortran 子例程不适用于 R 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com