【发布时间】:2025-12-30 17:35:10
【问题描述】:
我想包含一个带有我们正在编写的 R 包的功能的闭包。该函数(及其兄弟)将在其环境中拥有数据,执行输入与数据的比较,并返回结果。举例来说,考虑一个具有内置电话簿的函数:您使用一个号码进行查询,该函数返回一个名称。
这个函数将被我们的 R 包中的其他几个函数作为助手调用,所以一旦包被加载,它就必须存在。我们希望该函数在包环境中可用,就像任何其他函数一样。
我应该通过它在 .onLoad() 中的工厂函数创建它并将其分配给包环境吗?我可以将它作为 .RDS 发送吗?或者 RData,或者这是否违反了 CRAN 关于“二进制可执行代码”的政策?还是有不同的规范方式?代码和数据(或 RDS/RData)会放在包目录结构中的什么位置?
(我看到关于如何记录闭包的问题已经讨论过here)。
【问题讨论】:
-
alistaire - 此关闭预计不会更改。因此使用 onLoad 创建它似乎没有错 - 不是吗?
-
@alistaire - “R 仍然不允许你将它分配给包命名空间”我可能误解了 ns-hooks 文档 - 但我认为这意味着这就是
.onLoad()、.onAttach()用于:.onLoad()处理在命名空间被密封之前需要发生的事情,.onAttach()用于在环境被密封之前需要发生的事情。 -
这个问题实际上只涵盖了问题标题的一个特殊情况:如何在 R 包中包含一个闭包,当且仅当工厂在加载时被调用。如果用户在加载包后调用工厂,并在包内部生成/修改函数,那么任何人都有解决方案?
-
我刚刚拒绝了@Ma Ba 对我的自我回应的深思熟虑的编辑。我认为他们的方法很有用,但我真的不能在我的回复中声称对它的信任(而且它与所述的原始问题没有直接关系)。所以:请添加您的建议作为您自己的回复。
-
感谢@hyginn;同意。我将其添加为答案,因为这是搜索问题时弹出的第一件事,并且在其他任何地方都找不到解决方案