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 函数的函数不同。我的问题是:
我尝试打电话
.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 的一个相对较新的功能。
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) 弄清楚如何访问源代码来自另一个包的代码,这可能会再次遇到包检查器的问题。