Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 简单但可维护的代码重用_R - Fatal编程技术网

R 简单但可维护的代码重用

R 简单但可维护的代码重用,r,R,假设我有一个很小的(3-4行)函数,我经常使用它 因为它很小,所以很容易将它复制粘贴到每个需要它的源文件中,但是复制粘贴不是一种可维护的代码重用形式 相反,我想把这个函数放在它自己的文件中,并根据需要从其他源文件导入它 到目前为止,我只找到了两种方法: 为my function创建一个R包,将其安装到my R库中,并运行客户端代码,例如库(myfunction) 让客户端代码执行source(“path/to/my/function.R”) (对于我心目中的简单用例,第一个选项让我印象非常深刻。

假设我有一个很小的(3-4行)函数,我经常使用它

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

相反,我想把这个函数放在它自己的文件中,并根据需要从其他源文件导入它

到目前为止,我只找到了两种方法:

  • 为my function创建一个R包,将其安装到my R库中,并运行客户端代码,例如
    库(myfunction)
  • 让客户端代码执行
    source(“path/to/my/function.R”)
  • (对于我心目中的简单用例,第一个选项让我印象非常深刻。目前,我不打算将此函数提交给CRAN,甚至不打算与任何其他人共享。我只想从我的一次性R脚本中使用它。)

    还有别的办法吗


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

    # hello.py
    
    def hello():
        print "hello, world"
    
    …并将此文件放在my
    PYTHONPATH
    变量的目录中。然后,要在任何脚本
    some_script.py
    中使用该函数,我需要做的就是

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

    我基本上是在R中寻找与此最接近的等价项。

    您可以将其添加到
    ~/.Rprofile
    中,然后在那里定义它

    另外:一个位置,总是源代码的,甚至可以通过
    if(interactive())
    etc pp进行控制。比一个包的工作量少


    负:全球可视性。

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

    出于好奇,我构建了一个可以在我的机器上运行的包,不到五分钟就完成了。它只有一个功能

    这就是我所做的

    在R我跑了

    package.skeleton(name = "OneFunc", path = [package_path])
    
    接下来,我在
    [package\u path]/R
    中创建了一个.R文件,并将其放入函数定义中。明确地说,下面就是我的文件中包含的内容

    my_useful_function <- function(x){
      x^2
    }
    
    返回值
    9

    因此,您可以快速创建一个脏包,这样就可以很容易地加载一个(或多个)函数,而无需构建一个适合CRAN的包

    优点:

  • 清晰性-您没有Dirk答案的缺点,因为您仍然需要在代码中编写
    library(OneFunc)
    。所以至少有迹象表明你做了些什么
  • 源代码
    的工作量几乎不多,而且您不必每次都调用目录(仅在重新安装软件包时)
  • 它将很容易扩展到加载多个函数。要将另一个函数添加到
    OneFunc
    中,只需将文件放到R子目录中,然后重新安装软件包
  • 缺点:

  • 没有文件。更糟糕的是,因为您通过
    加载了一个包,在其他人看来,它就像应该有文档一样。老实说,我更喜欢这个函数,而不是突然出现的函数,因为它在您的
    /.Rprofile
    中,但这是一个偏好问题

  • 但说真的,我花了三倍的时间来写下这个回复,就像它花了三倍的时间来制作一个简单的软件包一样。我想你会觉得这是值得的。

    谢谢!但是,请看我的编辑。我有点惊讶它在没有指定
    code\u文件的情况下为我运行,但却没有为您运行。查看文档,似乎我的环境中一定有什么东西被引入并防止了错误。对不起,我没能早点赶上。缺点很容易解决。编写一些简短的文档(以及良好的编码实践)并不困难,或者将其放入Rprofile:
    import
    
    devtools::install_local([package_path])
    library(OneFunc)
    my_useful_function(3)