我正在构建一个使用两个主要功能的包。其中一项功能model.R
需要特殊类型的模拟sim.R
以及在表table.R
在可共享的包中,如何同时调用sim.R
中的table.R
和model.R
文件?我已尝试source("sim.R")
和source("R/sim.R")
,但该电话无法在套餐内工作。有什么想法吗?
我是否应该将代码从sim.R
和table.R
复制并粘贴到model.R
脚本中?
编辑:
我在R目录中有所有脚本,DESCRIPTION和NAMESPACE文件都已设置完毕。我只在R目录中有多个脚本。 ~R /有premodel.R
model.R
sim.R
和table.R
。我需要model.R
脚本来使用位于包中相同目录中的sim.R
和table.R
函数...(例如~R /)。
答案 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文件为此提供了可选的 Collate 字段。只需按照处理顺序列出所有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)
通过使用<< - 而不是< - 来定义它们的全局功能,它们将可用于在该环境中运行的任何其他脚本。