包含仅运行一次代码的 R 包(每次安装)

R package with code that only runs once (per installation)

我想创建一个 R 包,在安装时显示维护者的联系信息,并请求用户允许将它们计入我们的安装列表。在用户第一次调用我们的功能时使用代码 运行 也是可以接受的,而不是在安装时立即使用。无论哪种方式,这条消息应该只出现一次(除非用户重新安装/更新包)。

我考虑过的:

有什么好的方法吗?

这可以 运行 不止一次,但只能在有限的时间内 window 所以也许它已经足够好了。

将此代码添加到您的程序包中,它会在安装后 7 天内的任何时候加载程序包时发出消息,此后在程序包更新之前不会再次发出消息。

它的工作原理是将安装文件的创建时间与当前时间进行比较。它不需要对任何目录的写权限,只需要读权限,所以它应该可以正常工作。

.onLoad <- function(libname, pkgname) {
   ctime <- file.info(find.package(pkgname, libname))$ctime
   if (difftime(Sys.time(), ctime, unit = "day") < 7)
      packageStartupMessage("This msg will go away one week after installing this package")
}

您可能不得不硬着头皮跨会话存储状态信息以显示它一次且仅一次

一些可能有帮助的软件包:

但我不确定写的是哪一个。也许最后一个符合要求。

编辑: 事实证明,即使 pkgconfig 也不会跨会话保留值。当我控制要写入的目录或数据库时,我已经用公司本地代码解决了这个问题。对于 public 和可移植代码,它有点难。我仍然认为有一个包可以在所有主要操作系统上存储用户级配置,但我现在记不起名字了。

编辑 2: 向 Gabor Csardi 点头致意以刷新我的记忆,rappdirs 解决了 便携 的问题为每个用户提供一个配置位置(还有其他技巧,相应 Python 库的端口)。将它与一个简单的 cvs 或 rds 文件结合起来,以存储您最后一次显示消息的时间(完全),您现在可以显示它 一次 并且恰好一次。软件包升级后甚至不再出现。

以下代码允许您在包库中创建一个文件:

activate_file = paste(system.file('extdata', package = 'your_package'), 'activated.txt', sep = '/')
file.exists(activate_file)
# FALSE
file.create(activate_file)

file.exists(activate_file)
# TRUE

现在您可以检查 .onLoad 是否存在 activated.txt 文件。第一次显示消息,然后创建 activated.txt,下次使用包时,onload 函数会看到文件并可以跳过消息。

优点:

  • 持续会话。
  • 确保用户具有创建文件的写入权限的平台独立方式。

缺点:

  • Reinstall/upgrade 擦除 activated 文件,从而再次显示消息。

如果这不可接受,您可以尝试找到一个固定位置,例如在主驱动器中执行此操作(例如 ~/.your_package/activated.txt)。那么挑战就是让这个平台独立。也许查看 path.expand(~) 以获取当前用户的主驱动器,不确定这是否适用于 Windows。