我正在阅读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
列表已经在全球环境中了。不是吗?
我很感激任何帮助。提前谢谢。
答案 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标签名称非常短。因此,您正在使用的软件包中可能已存在p
,b
或i
函数。