【发布时间】:2016-11-21 05:46:49
【问题描述】:
.Call 似乎记录得很差; ?.Call 解释了 PACKAGE 参数:
PACKAGE:如果提供,则将搜索字符串.NAME限制在此参数给出的 DLL 中(加上常规扩展名,'.so','.dll',...)。这个参数跟在
...之后,所以它的名字不能缩写。这是为了增加包的安全性,通过使用这个参数可以确保没有其他包可以覆盖它们的外部符号,也可以加快搜索速度(见“注意”)。
并在注释中:
如果要经常使用这些函数之一,请指定
PACKAGE(将搜索限制在单个 DLL)或将.NAME作为本机符号对象之一传递。搜索符号可能需要很长时间,尤其是在加载了许多命名空间时。对于链接到 R 的符号,您可能会看到
PACKAGE = "base"。请勿在您自己的代码中使用此符号:此类符号不是 API 的一部分,可能会在没有警告的情况下更改。
PACKAGE = ""曾经被接受(但未被记录):现在是一个错误。
但没有使用示例。
尚不清楚PACKAGE 参数的工作原理。例如,在回答this 问题时,我认为以下应该有效,但它没有:
.Call(C_BinCount, x, breaks, TRUE, TRUE, PACKAGE = "graphics")
相反,这是可行的:
.Call(graphics:::C_BinCount, x, breaks, TRUE, TRUE)
这仅仅是因为C_BinCount 未导出吗?也就是说,如果hist.default的内部代码添加了PACKAGE = "graphics",这会起作用吗?
这看起来很简单,但真的很难找到这个论点的用法;我发现的所有消息来源都只是顺便提及(1、2、3、4、5)......这个实际工作的例子将不胜感激(即使它只是引用代码在现有包中找到)
(出于自包含目的,如果您不想从其他问题复制粘贴代码,这里是x 和breaks):
x = runif(100000000, 2.5, 2.6)
nB <- 99
delt <- 3/nB
fuzz <- 1e-7 * c(-delt, rep.int(delt, nB))
breaks <- seq(0, 3, by = delt) + fuzz
【问题讨论】:
-
好问题,我刚刚google了一下,我发现了一些可以给你一些提示的东西,以防万一没有人有经验biostat.jhsph.edu/~bcaffo/statcomp/files/dotCall.pdf
-
@Learner 确实是我的问题中的链接 3
-
使用 .Call 来自其他包的未记录的东西是一个非常糟糕的主意,并且是应该保持未记录的未记录事物的完美示例。这意味着它不应该记录在 SO 文档站点上。或其他任何地方。
-
@MichaelChirico 当然,但这仍然不能消除您在这个问题上......错的基本事实。