r - 如何避免评估和解析?
问题描述
我编写了一个函数,该函数可以获取包含其他函数脚本的文件,并将这些函数存储在另一个环境中,这样它们就不会弄乱全局环境。该代码有效,但包含以下三个实例eval(parse(...))
:
# sourceFunctionHidden ---------------------------
# source a function and hide the function from the global environment
sourceFunctionHidden <- function(functions, environment = "env", ...) {
if (environment %in% search()) {
while (environment %in% search()) {
if (!exists("counter", inherits = F)) counter <- 0
eval(parse(text = paste0("detach(", environment, ")")))
counter <- counter + 1
}
cat("detached", counter, environment, "s\n")
} else {cat("no", environment, "attached\n")}
if (!environment %in% ls(.GlobalEnv, all.names = T)) {
assign(environment, new.env(), pos = .GlobalEnv)
cat("created", environment, "\n")
} else {cat(environment, "already exists\n")}
sapply(functions, function(func) {
source(paste0("C:/Users/JT/R/Functions/", func, ".R"))
eval(parse(text = paste0(environment, "$", func," <- ", func)))
cat(func, "created in", environment, "\n")
})
eval(parse(text = paste0("attach(", environment, ")")))
cat("attached", environment, "\n\n")
}
关于构造的次优性已经写了很多eval(parse(...))
(见这里和这里)。但是,我发现的讨论主要涉及子集的替代策略。我的代码中的第一个和第三个实例eval(parse(...))
不涉及子集(第二个实例可能与子集有关)。
有没有办法调用new.env(...)
,[environment name]$[function name] <- [function name]
和attach(...)
不诉诸eval(parse(...))
?谢谢。
注意:我不想更改函数的名称.name
以将它们隐藏在全局环境中
解决方案
就其价值而言,该函数source
实际上使用eval(parse(...))
了 ,尽管方式有些微妙。首先,.Internal(parse(...))
用于创建表达式,经过更多处理后传递给eval
. 所以eval(parse(...))
在这种情况下,对于 R 核心团队来说似乎已经足够好了。
也就是说,您无需费劲儿就可以将函数导入新环境。 提供了一个可用于此目的 source
的论点。local
local:TRUE、FALSE 或环境,确定解析表达式的评估位置。
一个例子:
env = new.env()
source('test.r', local = env)
测试它的工作原理:
env$test('hello', 'world')
# [1] "hello world"
ls(pattern = 'test')
# character(0)
以及一个使用它的示例test.r
文件:
test = function(a,b) paste(a,b)
推荐阅读
- vue.js - Vue 是否支持 svg 元素?
- excel - 是否可以摆脱 Excel 中的删除警告声音?
- sql - 如何从基于嵌套 json 的 BigQuery 表中进行选择?
- python - Docker & Django:谷歌地图 JavaScript API 错误
- mongoose - 根据一长串用户中的点数查找我当前的排名
- java - 在 Apache Common 的 FTPClient 中使用“RETR”FTP 命令
- oop - java.util.HashMap 字段阈值的设计?
- angular - 尝试在 Angular 中使用 Google People API 获取生日和性别
- php - 合并多维数组保留键不起作用
- amazon-web-services - 如何使用 AWS Connect 进行手动拨出电话?