【问题标题】:: Run code first time a package is installed or used: 首次安装或使用包时运行代码
【发布时间】:2010-10-25 21:31:23
【问题描述】:

我正忙着为一个对 R 知之甚少的客户编写一个包。鉴于他们的复杂数据结构,我需要在 R 中建立一个“数据库”,其中包含从他们从另一个电子表格中获得的一组电子表格中获得的大量信息公司。由于他们无法在他们的计算机上安装 SQL 等(ICT 存在一些电源控制问题......),我已经基于特定的目录结构在 R 中编写了一个仿真。现在我想自动运行它,但只是在第一次加载包时。类似于.First.lib,然后是.VeryFirst

任何关于如何在第一次加载包时加载一段代码的想法?我在手册的任何地方都找不到它,所以欢迎大家指点。

【问题讨论】:

  • 为什么不让.First.lib.onLoad 检查“数据库”是否已创建?
  • @Joshua:我一直在考虑相同的问题,但想知道在 R 中是否真的可以检测包是否是第一次加载。我也一直在研究使用 INSTALL 文件的可能性,但我还没有完全掌握如何使用它们。
  • 我不认为你可以检查包是否是第一次加载。但是,如果您检查“数据库”并且它不存在,则创建它(这肯定会在第一次加载时发生)。下次加载包时,检查“数据库”,看看它已经在那里,然后继续。
  • 你能教客户端只在第一次加载时运行一个非常具体的功能吗?提示:loadMeOnlyWhenJorisSaysSo().
  • 嗯……他们的管理技能比我好。如果你发现我的想法,我想每个人都在他的工作中......

标签: r installation package


【解决方案1】:

它在手册中。

基本上你有两个代码路径:

  1. 没有 NAMESPACE 的包可以使用函数 .First.lib(),通常来自 R/zzz.R

  2. 带有 NAMESPACE 的包可以使用函数 .onLoad(),通常也来自 R/zzz.R

我已将其用于一些技巧,例如在加载时自行更新包 (!!)。这要求在实际加载二进制代码之前不使用 NAMESPACE 并运行 utils::update.packages()

【讨论】:

  • 感谢答案,但是这些函数不是每次加载包时都会加载代码,还是我完全错误地获取了帮助文件?我只想在第一次加载包时调用代码。
  • 当然,所以您使用file.exists() 和朋友来检查结构是否存在,然后跳过第二次、第三次、... 次创建它。但是你问在启动时在哪里创建它,我试图回答这个问题。
  • 软件包是否可以在 Windows 上自行更新?还是奇怪的文件锁定会导致问题?
  • 是的,尽管由于不使用会延迟动态加载的名称空间而导致可怕的锁定,但我仍然可以在 Windows 上运行它。然后我在拨打update.packages() 之后拨打library.dynam()。这行得通——但它是一个 hack(因为我宁愿保留一个 NAMESPACE)。
  • 那我们理解错了。我的意思是 first 启动。我非常熟悉 onLoad 和 .First.lib
【解决方案2】:

如何为他们指定一个路径和命名法来放入电子表格。您可以递归目录以获取更新和文件。我这样做是为了解决类似的问题。

2010 08.xls 2010 09.xls

您可以使用 readline() 来提示新的数据范围,也可以使其只需要输入新的月份。如果目录发生变化,教别人如何 setwd() 或使用检查您的个人/公司服务器上的某些内容的脚本自己更新它并不难。

他们实际上是在加载 R 来运行包吗?还是全是命令行?

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2022-11-11
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多