2017-04-16 78 views
0

我正在阅读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) 

我的问题是,我不知道为什么,他说“我已经把功能列表,因为我不想让他们成为所有可用的时间。现有R函数和HTML标记之间存在冲突的风险很高...最后,您可以使用list2env()将函数复制到全局环境。您可以通过在完成后删除函数来撤消此功能。

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

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

上面的代码返回TRUE,这意味着html已经存在于全球环境。所以,我不太确定他为什么这么说:“......你可以用......将功能复制到全球环境中”。我认识到他不会错。所以,我想为专家发布这个问题。

而且,如果我跑:

where("html") 

我得到:

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

从上面的代码,这听起来像html名单是在全球环境了。不是吗?

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

回答

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