R包,代码只运行一次(每次安装)

时间:2016-11-22 18:06:21

标签: r analytics

我想创建一个R软件包,在安装后会显示维护者的联系信息,并要求用户在我们的安装列表中对其进行计数。在用户第一次调用我们的一个函数时运行代码也是可以接受的,而不是立即安装。无论哪种方式,此消息应该只出现一次(除非用户重新安装/更新包)。

我考虑过的事情:

  • 我知道如何包含供内部使用的数据集,但我不知道如何永久更改这些数据。
  • 我们可以设置环境变量/应用设置,但我不知道是否有办法在会话结束后保持这种状态。
  • 使用外部服务/服务器会过于沉重,并且不允许不想跟踪的用户关闭该消息。

有没有好办法呢?

3 个答案:

答案 0 :(得分:5)

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

将此代码添加到您的软件包中,它将在安装后的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")
}

答案 1 :(得分:4)

您可能需要咬紧牙关并在会话中存储状态信息,以便只显示一次

一些可能有用的软件包:

但我不确定哪一个读取写入。也许最后一个适合这个法案。

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

编辑2:通过向Gabor Csardi点头来刷新我的记忆,rappdirs解决了可移植为每个用户提供配置位置的问题(与其他技巧一样,相应的Python库的端口)。将它与一个简单的cvs或rds文件结合起来存储,当你最后一次显示消息时,你现在可以将它显示为一次并且只显示一次。包升级后甚至没有再次。

答案 2 :(得分:1)

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

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函数看到该文件并可以跳过该消息。

优点:

  • 坚持会议。
  • 独立于平台的方式,确保用户具有创建文件的写权限。

缺点:

  • 重新安装/升级会擦除activated文件,从而再次显示该消息。

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