将函数复制到全局环境

Copying the functions to global environment

我正在阅读 Hadley 的 Advanced R。我在第 10 章 - "Functional Programming." 第 192 页。这也可以在标题 "Moving lists of functions under global environment."

下找到: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())

上面的代码returnsTRUE,也就是说html已经存在于全局环境中。所以,我不太确定他为什么说“......你可以将功能复制到全局环境......”我承认他不会错。所以,我想到了向专家提出这个问题。

此外,如果我运行:

where("html")

我得到:

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

从上面的代码来看,html 列表似乎已经在全局环境中了。不是吗?

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

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 函数。