我目前在R中遇到了eval函数的问题.在我的实际代码中,我加载了多个库,但为简单起见,我将使用data.table作为示例.

以下是我的代码片段:

test_code <- "library(data.table); data.table(iris)"
new_env <- new.env(parent = baseenv())
eval(parse(text = test_code), envir = new_env)

当我运行这段代码时,我得到以下错误:

Error in data.table(iris) : could not find function "data.table"

似乎eval函数没有在新环境中加载data.table库.我不确定为什么会发生这种情况,因为我期望在新环境中加载库和data.table函数.

值得注意的是,虽然这个简化的示例只需要加载一个库,但我的实际项目涉及到一个更加复杂和冗长的R test_code,需要加载许多库.由于我无法预测哪些库需要加载,我希望它们能够在判断代码时自动加载.


Edit
The goal is to test if a codebase that is in principle self-sufficient operates correctly in a completely new environment. In other words, that it works from scratch.

更多背景信息:

我正在开发一个shiny 的数据清理应用程序,它还可以创建R代码来复制应用程序中执行的所有操作,包括加载库.我的目标是测试和判断这个R代码,以验证结果清理后的数据集是否与shiny 应用程序中的数据集匹配.因为R码是动态生成的,所以我事先不知道它的内容.最后,我需要访问R代码(可通过new_env$DT访问)生成的清理后的数据集,并将其与应用程序生成的数据集进行比较.代码复制测试应该与shiny 的应用程序一起执行.

推荐答案

问题是,您的new_env环境的父级设置为baseenv(),而baseenv()的父级为空.您没有将任何对象放入new_env中,因此当您在该环境中计算表达式时,将只找到baseenv()中的对象.library()是基本环境中的一个函数,因此不会触发错误,但library()修改的是搜索列表,而不是基本环境,因此永远不会找到data.table().

要知道如何修复您的代码,我需要知道您想要它做什么.

  • 如果您只想访问data.table函数,您可以保留new_env的定义不变,但执行data.table::data.table(iris).

  • 如果您希望在搜索列表中附加data.table的副作用,并且希望在不使用前缀的情况下计算表达式,则可以将父对象设置为globalenv().然而,这将允许用户将名为data.table的函数放入全局环境中,并且它将优先于data.table包中的函数.

  • 如果您想要更改搜索列表的副作用,但又想跳过全局环境,我认为这很混乱:搜索列表中的第一个条目是globalenv()的父项,但library(data.table)可能会改变这一点.所以您可以使用library(data.table, pos = 3),但是如果您想要执行您向我们展示的代码,我认为您不能使用envir的单一规范来实现.您需要解析代码并一次计算一个表达式,每个表达式使用envir = parent.env(globalenv()).例如:

test_code <- "library(data.table); print(data.table(iris))"

new_env <- new.env(parent = parent.env(globalenv()))

exprs <- parse(text = test_code)

for (i in seq_along(exprs)) {
  eval(exprs[[i]], envir = new_env)
  parent.env(new_env) <- parent.env(globalenv())
}

您在一条 comments 中说:"代码应该是自给自足的,所以我们的 idea 是在一个全新的环境中测试代码,并确保一切都按预期工作."在这种情况下,我不会使用我的样例代码,它以一种非常奇怪的方式计算它.您应该做R CMD check所做的事情,即启动一个新的R进程,通过获取包含代码的文件来运行测试.

R相关问答推荐

查找满足SpatRaster中条件的单元格位置

根据收件箱中的特定值提取列名

在(g)子中使用asserable字符

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

ggplot2中的X轴显示数值,单位为百,而不是十

如何在emmeans中计算连续变量的对比度

在另一个函数中调用ggplot2美学

如何在编辑列时更新可编辑数据表,并使用该表在Shiny中执行连续计算

用关联字符串替换列名的元素

如何在观测缺失的地方添加零

R中的哈密顿滤波

合并后返回列表的数据帧列表

查找所有站点的最小值

在R中,如何将误差条放置在堆叠的每个条上?

在R中的数据框上使用Apply()函数时,如何保留非数字列?

使用ifElse语句在ggploy中设置aes y值

将文本批注减少到gglot的y轴上的单个值

R中的Desolve:返回的导数数错误

如何用不同长度的向量填充列表?

重写时间间隔模糊连接以减少内存消耗