R从自动完成中隐藏包中的内部对象

R Hide internal objects in package from autocomplete

我正在 Rstudio 中开发一个包,我试图将对象保存为包的内部,这样用户就看不到它。我在 Rstudio 中创建了一个名为 "testpackage" 的默认包项目,然后执行:

library(devtools)
test.hidden.object <- 1:5
use_data(test.hidden.object,internal = T,overwrite = T)

然后我构建包,将其保存到我的库中。然后我重新启动 Rstudio,并执行:

library(testpackage)
test.hidden.object

它打印出:[1] 1 2 3 4 5

环境为空,正在执行:

ls()

打印出"character(0)"

据我所知,如果用户知道对象的名称,就不可能向用户隐藏包中的对象,我不想那样做。但让我担心的是自动完成功能能够找到这些对象。

在 Rstudio 和 R 控制台中,如果我加载包然后键入 "test.hid" 然后按 TAB,我可以看到对象 "test.hidden.object" 作为一个选项。自动完成是否应该能够显示内部对象?我构建的包不正确吗?

为了解决这个问题,我已经更新了 R、Rstudio、devtools,并且我自己手动创建了 sysdata.rda 文件,而不是使用 "use_data",但每次我都能看到具有自动完成功能的内部对象。

我认为您的描述有误。 RStudio 和其他 R 前端中的自动完成功能将仅显示在当前上下文中可见的符号。您的用户无法使用未导出的符号,因此自动完成不会显示它们。

您在自己的包中编辑文件时可能会看到隐藏符号,因为您的包代码可以看到隐藏符号。但您的用户不会。

编辑添加:我只是更仔细地按照您的指示进行操作,并设法复制了您所看到的内容。问题是默认情况下,NAMESPACE 文件将所有内容声明为 public,而不管 internal 的设置如何。这看起来像是 devtools 的误解或错误。 要修复它,请手动编辑您的 NAMESPACE 文件以确保仅导出 public 个符号。

第二次编辑:devtools::use_data 的文档已在 Github 上更新。他们现在说“如果 TRUE,将所有对象存储在一个 R/sysdata.rda 文件中。此文件中的对象遵循通常的导出规则。请注意,这意味着如果您使用通用 exportPattern() 导出除以 .."

开头的对象之外的所有对象的规则