简单但可维护的代码重用

kjo*_*kjo 4 r

假设我有一个很小的(3-4行)函数,我倾向于使用很多.

由于它很小,很容易将其复制粘贴到需要它的每个源文件中,但复制粘贴不是一种可维护的代码重用形式.

相反,我想将此函数放在自己的文件中,并根据需要以某种方式从其他源文件中导入它.

到目前为止,我发现只有两种方法可以做到这一点:

  1. 为我的函数创建一个R包,将它安装在我的R库中,并运行客户端代码,例如library(myfunction);
  2. 让客户端代码执行source("path/to/my/function.R").

(对于我想到的简单用例,第一个选项对我来说非常苛刻.目前,我不打算将此功能提交给CRAN,甚至不与其他任何人分享.我只想要要做的是从我的一次性R脚本中使用它.)

还有其他方法可以做到这一点吗?


例如,在Python中,我可以将tiny函数放在某个文件中:

# hello.py

def hello():
    print "hello, world"
Run Code Online (Sandbox Code Playgroud)

...并将此文件放在我的PYTHONPATH变量的目录中.然后,要在任何脚本中使用该功能some_script.py,我需要做的就是

# some_script.py

import hello

hello.hello()
# hello, world
Run Code Online (Sandbox Code Playgroud)

我基本上是在寻找与R中最接近的相同的东西.

Dir*_*tel 6

您可以将它添加到您的,~/.Rprofile并在那里定义它.

另外:一个地方,总是来源,甚至可以通过if (interactive())等等来控制.比工作包更少的工作.

减:全球可见度.


Ben*_*min 6

我想你可能会惊喜地发现为自己个人使用包装是多么简单.请记住,即使远程满足CRAN的要求,您也可以构建和安装软件包.

出于好奇,我在我的机器上构建了一个可在不到五分钟内完成的软件包.它只有一个功能.

这就是我做的.

在RI跑

package.skeleton(name = "OneFunc", path = [package_path])
Run Code Online (Sandbox Code Playgroud)

接下来,我[package_path]/R在我的函数定义中创建了一个.R文件.明确地说,这正是我的文件中包含的内容.

my_useful_function <- function(x){
  x^2
}
Run Code Online (Sandbox Code Playgroud)

然后我回到R跑了

devtools::install_local([package_path])
library(OneFunc)
my_useful_function(3)
Run Code Online (Sandbox Code Playgroud)

它返回了值9.

因此,您可以快速创建一个脏包,这样可以非常轻松地加载一个(或多个)函数,而无需完成构建适合CRAN的包的所有工作.

好处:

  1. 清晰度 - 你没有Dirk答案的缺点,因为你仍然需要写library(OneFunc)代码.所以至少有一些迹象表明你已经做了一些事情.
  2. 这几乎没有什么工作source,你不必每次都回忆起目录(只有当你重新安装包时)
  3. 它将很容易扩展到加载不仅仅是一个功能.要添加另一个函数,您需要做的OneFunc就是将文件放在R子目录中并重新安装软件包.

缺点:

  1. 没有文件.更糟糕的是,因为你通过library它加载了一个软件包,它会向其他人看,就像应该有文档一样.老实说,我更喜欢这个功能,因为它出现在你的身上/.Rprofile,但这是一个偏好问题.

但是说真的,我写这个响应花了三倍的时间来制作裸骨包.我想你会觉得值得你这么做.