我们说我有一个小的(3-4行)功能,我倾向于使用很多。
由于它很小,因此很容易将其复制粘贴到需要它的每个源文件中,但复制粘贴不是可重复使用的可维护形式。
相反,我想将此函数放在自己的文件中,并以某种方式从其他源文件中导入它。
到目前为止,我发现只有两种方法可以做到这一点:
library(myfunction)
; source("path/to/my/function.R")
。(对于我想到的简单用例,第一个选项对我来说非常苛刻。目前,我并不打算将此功能提交给CRAN,甚至不与任何人分享我想要做的就是从我的一次性R脚本中使用它。)
还有其他方法吗?
例如,在Python中,我可以将微小的函数放在某个文件中:
# hello.py
def hello():
print "hello, world"
...并将此文件放在我的PYTHONPATH
变量的目录中。然后,要在任何脚本some_script.py
中使用该函数,我需要做的就是
# some_script.py
import hello
hello.hello()
# hello, world
我基本上在寻找与R中最接近的相同的东西。
答案 0 :(得分:6)
您可以将其添加到if (interactive())
,然后在那里定义。
另外:一个位置,总是来源,甚至可以通过margins
等来控制。比工作包更少的工作。
减:全球可见度。
答案 1 :(得分:6)
我认为您可能会惊喜地发现为自己个人使用包装是多么简单。请记住,即使远程满足CRAN的要求,您也可以构建和安装软件包。
出于好奇,我在我的机器上构建了一个可在不到五分钟内完成的软件包。它只有一个功能。
这就是我的所作所为。
在R我跑
package.skeleton(name = "OneFunc", path = [package_path])
接下来,我在[package_path]/R
中创建了一个.R文件并输入了我的函数定义。明确地说,这正是我文件中包含的内容。
my_useful_function <- function(x){
x^2
}
然后我回到R并跑了
devtools::install_local([package_path])
library(OneFunc)
my_useful_function(3)
返回值9
。
因此,可以快速创建一个脏包,这样可以非常轻松地加载一个(或多个)函数,而无需完成构建适合CRAN的所有包的所有工作。
优点:
library(OneFunc)
。所以至少有一些迹象表明你已经做了一些事情。source
只需要更多的工作,而且您不必每次都重新调用该目录(仅在重新安装软件包时)OneFunc
,您需要做的就是将文件放在R子目录中并重新安装软件包。缺点:
library
加载了一个包,它会向其他人看,就像应该有文档一样。老实说,我更喜欢这个功能,因为它出现在你的/.Rprofile
中,但这是一个偏好问题。但是说真的,我写这个回应的时间是我用了三倍的时间来制作裸骨包。我想你会发现它值得你这么做。