将功能复制到全局环境

时间:2017-04-16 04:50:03

标签: r function environment

我正在阅读Hadley的Advanced R.我正在进行第10章 - "功能编程。"这也可以在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)

我的问题是,我不知道为什么他说&#34; 我已将这些功能放在一个列表中,因为我不希望它们一直可用。现有R函数与HTML标记之间存在冲突的风险很高......最后,您可以使用list2env()将函数复制到全局环境。您可以通过删除来撤消此操作完成后的功能。&#34;

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

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

上面的代码返回TRUE,这意味着html已存在于全局环境中。所以,我不确定他为什么这么说&#34; ...你可以将这些功能复制到全球环境中......&#34;我认识到他不会错。所以,我想把这个问题发给专家。

此外,如果我跑:

where("html")

我明白了:

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

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

我很感激任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:4)

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