【问题标题】:What's the most simple approach to name-spacing R files with `file::function`使用`file :: function`命名空间R文件的最简单方法是什么
【发布时间】:2020-08-31 00:57:31
【问题描述】:

回答此问题的标准

给定以下函数(在其自己的脚本中)

# something.R
hello <- function(x){
    paste0("hello ", x)
}

启用以下功能的最少设置量是多少

library(something)
x <- something::hello('Sue')
# x now has value: "hello Sue"

上下文

在python中,拥有一个包含一些代码的目录非常简单,并将其用作

# here foo is a directory
from foo import bar
bar( ... ) 

我不确定如何在 R 中做类似的事情。

我知道有source(file.R),但这会将所有内容都放入全局命名空间中。我也知道有library(package) 提供package::function。我不确定是否有一种简单的方法可以在 R 中使用这种命名空间。我搜索过的打包教程似乎非常复杂(与 Python 相比)。

【问题讨论】:

  • @baxx; sys.source("something.R", envir = something&lt;-new.env()); something$hello("Sue")
  • @user20650 我对使用script::function() 语法所需的最少代码量感兴趣,并且仍然希望看到这一点。但是,sys.source 绝对有用,可能为我解决了眼前的问题,谢谢。
  • 要么使用 source() 获取文件,要么创建包。你不需要在 R 中导入和命名空间文件。但是创建一个包很容易,而且真的不值得尝试解决它。​​
  • 如果我理解正确 - 创建一个包很容易,但过于冗长,无法粘贴到 stackoverflow 答案中
  • 你认为这是矫枉过正,因为你没有尝试过,但我向你保证,你的包上面的功能是 40 秒的工作

标签: r package setup-project


【解决方案1】:

我不知道仅为一个快速功能创建名称空间是否有真正的好处。这不是应有的方式(我认为)。

但无论如何,这是一个相当简约的解决方案:

首次安装一次:install.packages("namespace")

你想在命名空间中调用的函数:

hello <- function(x){
  paste0("hello ", x)
}

创建命名空间、分配功能并导出

ns <- namespace::makeNamespace("newspace")
assign("hello",hello ,env = ns)
base::namespaceExport(ns, ls(ns))

现在您可以使用新命名空间调用您的函数

newspace::hello("you")

【讨论】:

    【解决方案2】:

    这是我所知道的使用 RStudio 生成包的最快工作流程。默认包已经包含一个hello 函数,我用你的代码覆盖了它。

    请注意,还有一个“基于源文件创建包”的框,我没有使用,但您可以使用。

    以这种方式完成的包将包含导出的未记录的未测试函数。

    如果您想学习如何记录、导出或不导出、编写测试和运行检查、包含除函数之外的其他对象、包含编译代码、在 github 上共享、在 CRAN 上共享。This book 描述了数千人使用的工作流程用户,并且设计成您通常可以独立阅读部分。


    如果您不想从 GUI 执行此操作,您可以使用utils::package.skeleton() 构建一个包文件夹,并使用remotes::install_local() 安装它:

    可重复设置

    # create a file containing function definition
    
    # where your current function is located
    function_path <- tempfile(fileext = ".R")
    cat('
    hello <- function(x){
      paste0("hello ", x)
    }
    ', file = function_path)
    
    # where you store your package code
    package_path <- tempdir()
    

    解决方案:

    # create package directory at given location
    package.skeleton("something", code_file = file_path, path = package_path)
    # remove sample doc to make remotes::install_local happy
    unlink(file.path(package_path, "something", "man/"), TRUE) 
    # install package
    remotes::install_local(file.path(package_path, "something"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2014-01-28
      • 2010-09-22
      相关资源
      最近更新 更多