简单但可维护的代码重用

时间:2016-09-29 18:27:24

标签: r

我们说我有一个小的(3-4行)功能,我倾向于使用很多。

由于它很小,因此很容易将其复制粘贴到需要它的每个源文件中,但复制粘贴不是可重复使用的可维护形式。

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

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

  1. 为我的函数创建一个R包,将其安装在我的R库中,并运行客户端代码,例如: library(myfunction);
  2. 让客户端代码执行source("path/to/my/function.R")
  3. (对于我想到的简单用例,第一个选项对我来说非常苛刻。目前,我并不打算将此功能提交给CRAN,甚至不与任何人分享我想要做的就是从我的一次性R脚本中使用它。)

    还有其他方法吗?

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

    # hello.py
    
    def hello():
        print "hello, world"
    

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

    # some_script.py
    
    import hello
    
    hello.hello()
    # hello, world
    

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

2 个答案:

答案 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的所有包的所有工作。

优点:

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

    1. 没有文档。更糟糕的是,因为你通过library加载了一个包,它会向其他人看,就像应该有文档一样。老实说,我更喜欢这个功能,因为它出现在你的/.Rprofile中,但这是一个偏好问题。
    2. 但是说真的,我写这个回应的时间是我用了三倍的时间来制作裸骨包。我想你会发现它值得你这么做。