.spatstat.geom 包中的 C() 函数在 R 中不可用,尽管它是由 useDynLib 导出的

问题描述 投票:0回答:1

CRAN R 包 spatstat.geom 定义了一堆 .C 函数,并通过

将它们导出到 NAMESPACE 文件中

useDynLib(spatstat.geom, .registration=TRUE, .fixes="SG_")

但是我无法使用通常的 .C 语法访问这些函数。例如,nncross.ppp() 函数包含对

的调用

.C(SG_knnXinterface, ..., PACKAGE = "spatstat.geom")
,

这显然在 spatstat.geom 内部工作,但不在其外部,这与其他以明显相同的方式导出 C 函数的函数不同。我的问题是:

  1. 如何从控制台访问这些 C 功能?
  2. 这与 spatstat.* 包的“嵌套”包结构有关吗?

我尝试打电话

.C(SG_knnXinterface, ..., PACKAGE = "spatstat.geom")

但它又回来了

Error in .C("SG_nnXinterface", PACKAGE = "spatstat.geom", 2) :  "SG_nnXinterface" not available for .C() for package "spatstat.geom"
,

尽管我希望可以通过这种方式访问 C 函数。

一些最小的可重现示例:

有效(或至少找到功能)

.C("spline_value", PACKAGE = "cobs")

不起作用

.C("SG_nnXinterface", PACKAGE = "spatstat.geom")

我的会话信息():

R version 4.3.2 (2023-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.3 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0 
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=de_BE.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=de_BE.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=de_BE.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=de_BE.UTF-8 LC_IDENTIFICATION=C       

time zone: Europe/Amsterdam
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] spatstat.geom_3.2-7.007 spatstat.data_3.0-4    

loaded via a namespace (and not attached):
[1] compiler_4.3.2       deldir_2.0-2         Matrix_1.6-5         spatstat.utils_3.0-4
[5] tools_4.3.2          grid_4.3.2           polyclip_1.10-6      lattice_0.22-5
r c package namespaces
1个回答
0
投票

这是关于入口点的“本机注册”,这是 R 的一个相对较新的功能。

spatstat
包使用本机注册,而
cobs
包显然没有。

命名空间声明

UseDynLib(spatstat.geom, registration=TRUE, fixes="SG_")

告诉包加载器动态加载目标文件

spatstat.geom.so
,并且(因为
registration=TRUE
)查找名为
R_spatstat_geom_init
的C函数,该函数一定是
spatstat.geom
的作者编写的。加载器执行此函数,该函数有效地向 R 系统声明所有可用的 C 或 C++ 函数,将它们的字符串名称与其在编译的目标代码中的实际入口点相关联,并声明参数的数量和类型。然后,对于每个声明的 C 或 C++ 函数,加载程序将在与其关联的 R 语言中创建一个“符号”。因为指定了前缀
"SG_"
,所以 C 代码中定义的函数
nnXinterface
将与符号
SG_nnXinterface
关联。符号周围没有引号。该符号已添加到包的命名空间中。

如果您想使用 R 命令

.C
来执行函数
nnXinterface
,您需要访问符号
SG_nnXinterface
。这些符号不会从包中导出,但它们位于 ghe 命名空间中,例如

spatstat.geom:::SG_nnXinterface

会返回一些信息。我不确定如何以 R 包检查器可接受的方式访问这些符号。它肯定需要

spatstat.geom
已经加载。

如果您想从其他 C 代码调用 C 函数

nnXinterface
,那么您可以 (a) 将
nnXinterface
的源代码复制到您自己的包中,或者 (b) 弄清楚如何访问源代码来自另一个包的代码,这可能会再次遇到包检查器的问题。

© www.soinside.com 2019 - 2024. All rights reserved.