【问题标题】:How to call R script from another R script, both in same package?如何从同一个包中的另一个 R 脚本调用 R 脚本?
【发布时间】:2015-07-09 21:18:21
【问题描述】:

我正在构建一个使用两个主要功能的包。其中一个功能model.R 需要一种特殊类型的模拟sim.R 和一种在表格中设置结果的方法table.R

在可共享的包中,如何从model.R 中调用sim.Rtable.R 文件?我已经尝试过source("sim.R")source("R/sim.R"),但该调用在包内不起作用。有什么想法吗?

我应该将sim.Rtable.R 中的代码复制并粘贴到model.R 脚本中吗?

编辑: 我在 R 目录下有所有的脚本,DESCRIPTION 和 NAMESPACE 文件都设置好了。我在 R 目录中只有多个脚本。 ~R/ 有 premodel.R model.R sim.Rtable.R。我需要model.R 脚本来同时使用sim.Rtable.R 函数...位于包的同一目录中(例如~R/)。

【问题讨论】:

  • 如果你在写一个包,你不应该寻找文件,你应该把这些东西放在函数中并调用函数。
  • 可能是source(system.file(package = 'your_package', 'scripts', 'sim.r')),前提是您有一个/inst/scripts 目录

标签: r function package


【解决方案1】:

详细说明 joran 的观点,当你构建一个包时,你不需要 source 函数。

例如,假设我想创建一个名为 TEST 的包。我将首先生成一个名为 TEST 的目录(即文件夹)。在 TEST 中,我将创建另一个文件夹名称 R,在该文件夹中,我将包含所有包含包中不同函数的 R 脚本。

您至少还需要包含说明和命名空间文件。 man(用于帮助文件)和测试(用于单元测试)也很不错。

制作包非常简单。这是一个简单介绍的博客:http://hilaryparker.com/2014/04/29/writing-an-r-package-from-scratch/

【讨论】:

  • 谢谢Jacob,我把所有的脚本都放在R 目录下,DESCRIPTION 和NAMESPACE 文件都设置好了。我在 R 目录中只有多个脚本。 ~R/ 有 premodel.R model.R sim.Rtable.R。我需要model.R 脚本来同时使用sim.Rtable.R 函数...位于包的同一目录中(例如~R/)。
  • 是的,正如@joran 所说,在 R 包中,不需要源函数。换句话说,包中的每个函数都可以访问包中的所有其他函数。如果 model.R 中的函数依赖于 sim.R 和 table.R 中的函数,则只需调用这些函数。尝试安装你的包。
【解决方案2】:

正如其他人指出的那样,您不必在包中获取 R 文件。包加载机制将负责丢失命名空间并使所有导出的函数可用。所以通常你不必担心这些。

但也有例外。如果您有多个带有 R 代码的文件,则可能会出现处理这些文件的顺序很重要的情况。通常这并不重要,或者 R 使用的默认顺序恰好很好。如果您发现包中的某些依赖项未正确解析,您可能会遇到需要对 R 文件进行自定义处理顺序的情况。描述文件为此提供了可选的 Collat​​e 字段。只需按照应处理的顺序列出所有 R 文件以满足依赖关系。

【讨论】:

    【解决方案3】:

    如果您的所有文件都在 R 目录中,那么在您执行 package buildLoad_All 之后,任何 函数 都会在内存中。 如果您的文件中有不在函数中的代码,您可能会遇到问题。

    R 按字母顺序加载文件。

    通常,这不是问题,因为函数在被调用执行时被评估,而不是在加载时(id.一个函数可以引用另一个尚未定义的函数,即使在同一个文件中)。

    但是,如果您在 model.R 中的函数外部有代码,则此代码将在文件加载时立即执行,并且您的包构建通常会失败并带有

    ERROR: lazy loading failed for package 'yourPackageName'
    

    如果是这种情况,请将 model.R 的稀疏代码包装到一个函数中,以便稍后在包完全加载时调用它,也可以调用外部库。

    如果这段代码用于初始化某些值,请考虑使用use_data() 让 R 为您将数据加载到环境中。 如果这段代码只是交互式代码,用于测试和实现包本身,您应该考虑将其放在其他地方或将其包装到函数中。

    如果您确实需要在加载时执行该代码或确实需要解决依赖关系,那么您必须将 collat​​e 行添加到 DESCRIPTION 文件中,如 Peter Humburg 所述,以强制 R 加载文件顺序。 Roxygen2 可以帮助你,放在你的代码之前

    #' @include sim.R table.R
    

    致电roxygenize(),系统会为您生成整理行到DESCRIPTION文件中。

    但即便如此,你可能依赖的外部库还没有被包加载,导致在构建时再次失败。

    总之,如果 .R 文件位于包内,您最好不要将函数之外的代码留在函数之外。

    【讨论】:

      【解决方案4】:

      由于您正在构建一个包,您无法访问 /R 目录中的其他功能的原因是您首先需要:

      library(devtools)
      document()
      

      在你的包的工作目录中。 现在你的包中的每个函数都应该可以被任何其他函数访问了。然后,完成,做:

      build()
      install()
      

      虽然应该注意的是,一个简单的document() 调用已经足以解决您的问题。

      【讨论】:

        【解决方案5】:

        通过使用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 2022-08-02
          • 1970-01-01
          • 2018-06-04
          • 2012-01-11
          • 2019-06-18
          • 1970-01-01
          相关资源
          最近更新 更多