如何从同一个包中的另一个R脚本调用R脚本?

时间:2015-07-09 21:18:22

标签: r function package

我正在构建一个使用两个主要功能的包。其中一项功能model.R需要特殊类型的模拟sim.R以及在表table.R

中设置结果的方法

在可共享的包中,如何同时调用sim.R中的table.Rmodel.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 /)。

5 个答案:

答案 0 :(得分:4)

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

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

至少您还需要包含DESCRIPTION和NAMESPACE文件。一个人(用于帮助文件)和测试(用于单元测试)也很好。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

library(devtools)
document()

从您的包的工作目录中。 现在,您的包中的每个功能都可以被任何其他功能访问。然后,要完成,请执行:

build()
install()

虽然应该注意一个简单的document()电话已足以解决您的问题。

答案 3 :(得分:0)

如果您的所有文件都在R目录中,则在执行打包构建 Load_All 后,任何功能都将在内存中。 如果您的文件中的代码不在函数中,则可能会出现问题。

R按字母顺序加载文件。

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

但是,如果你在model.R中有一个外部函数,那么这个代码将在文件加载时立即执行,你的包构建通常会失败

ERROR: lazy loading failed for package 'yourPackageName'

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

如果这段代码用于初始化某个值,请考虑让use_data()让R负责将数据加载到环境中。 如果这段代码只是用于测试和实现包本身的交互式代码,那么您应该考虑将其放在别处或将其包装到函数中。

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

#' @include sim.R table.R

调用roxygenize(),将为您生成整理行到描述文件。

但即使这样做,您可能依赖的外部库尚未被包加载,导致在构建时再次失败。

总之,如果代码位于包中,最好不要将代码保留在.R文件中。

答案 4 :(得分:0)

通过使用<< - 而不是< - 来定义它们的全局功能,它们将可用于在该环境中运行的任何其他脚本。