将函数复制到全局环境
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 标签名称很短。因此,您正在使用的包中可能已经存在 p
、b
或 i
函数。
我正在阅读 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 标签名称很短。因此,您正在使用的包中可能已经存在 p
、b
或 i
函数。