【问题标题】:Copying the functions to global environment将函数复制到全局环境
【发布时间】:2017-09-12 00:40:49
【问题描述】:

我正在阅读 Hadley 的 Advanced R。我在第 10 章——“函数式编程”。第 192 页。这也可在:http://adv-r.had.co.nz/Functional-programming.html 的标题“在全局环境下移动函数列表”下获得。

代码如下:

simple_tag <- function(tag) {
  force(tag)
  function(...) {
    paste0("<", tag, ">", paste0(...), "</", tag, ">")
  }
}
tags <- c("p", "b", "i")
html <- lapply(setNames(tags, tags), simple_tag)

我的问题是我不明白他为什么说“我将这些函数放在一个列表中,因为我不希望它们一直可用。现有 R 之间发生冲突的风险函数和 HTML 标记高...最后,您可以使用 list2env() 将函数复制到全局环境。您可以在完成后通过删除函数来撤消此操作。"

这是因为如果我运行以下代码:

exists("html",envir = globalenv())

以上代码返回TRUE,表示html已经存在于全局环境中。所以,我不太确定他为什么说“......你可以将函数复制到全局环境......”我承认他不会错。所以,我想把这个问题发给专家。

此外,如果我运行:

where("html")

我明白了:

<environment: R_GlobalEnv>
attr(,"path")

从上面的代码中,听起来html 列表已经在全球环境中了。不是吗?

如果有任何帮助,我将不胜感激。提前致谢。

【问题讨论】:

    标签: r function environment


    【解决方案1】:

    html 不是一个函数,但它是一个保存在全局环境中的对象,正如 where("html") 所演示的那样。相反,html 是一个包含 3 个函数的列表。

    names(html)
    # [1] "p" "b" "i"
    

    要访问html 中的一个函数,您可以使用:html$p() 和一个参数。见:

    html$p
    # function(...) {
    #     paste0("<", tag, ">", paste0(...), "</", tag, ">")
    #   }
    # <environment: 0x1093fe698>
    

    list2env() 会将html 中的函数保存在全局环境中。例如

    p      # < DOESN'T exist in global environment
    # Error: object 'p' not found
    
    list2env(html,envir = globalenv())
    p      # < DOES exist in global environment
    # function(...) {
    #     paste0("<", tag, ">", paste0(...), "</", tag, ">")
    #  }
    # <environment: 0x1093fe698>
    

    但是,如果全局环境中已经存在p 变量或函数,则在您使用list2env 时它将被覆盖。覆盖 html 标签的风险很高,因为 html 标签名称很短。因此,您正在使用的包中可能已经存在pbi 函数。

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 2020-07-24
      • 2018-02-16
      • 1970-01-01
      • 2019-09-18
      • 2017-04-07
      • 2016-04-22
      • 2016-03-27
      相关资源
      最近更新 更多