重设.GlobalEnv父环境后magrittr管道函数异常可用问题咨询
magrittr管道符
%>%的异常求值问题 加载magrittr包后修改.GlobalEnv的父环境会出现异常行为:即使magrittr不在搜索路径中,且exists()和getAnywhere()均显示该函数不可公开访问,magrittr的管道函数%>%仍可直接通过名称调用。
该问题源于尝试创建类似callr的轻量级隔离评估环境(无需启动新R进程)的测试场景。
复现步骤
## 保存.GlobalEnv当前父环境并设置新父环境 original_parent = parent.env(.GlobalEnv) parent.env(.GlobalEnv) = new.env(parent=baseenv()) ## 在新环境下加载magrittr包 library(magrittr) exists("%>%") # 返回TRUE try("abc" %>% toupper) # 输出ABC ## 恢复.GlobalEnv原父环境并卸载命名空间 parent.env(.GlobalEnv) = original_parent exists("%>%") # 如预期返回FALSE try("abc" %>% toupper) # 仍输出ABC <- 异常点
异常现象细节
- 运行
getAnywhere("%>%")显示该函数仍加载于namespace:magrittr,但按R的求值逻辑,因magrittr不在搜索路径,应无法找到%>%并抛出错误。 - 即使执行
unloadNamespace("magrittr")后getAnywhere()无结果,该异常现象仍存在。
已知卸载命名空间可能无法卸载DLL,且%>%可能属于此类对象,但无法理解为何在magrittr不在搜索路径时控制台仍能调用它,这与R代码求值逻辑不符。
运行环境:R 4.2.1(Posit Workbench),新会话搜索路径为c(".GlobalEnv", "tools:rstudio", "package:stats", "package:graphics", "package:grDevices", "package:utils", "package:datasets", "package:methods", "Autoloads", "package:base"),仅magrittr的%>%出现该异常。
内容的提问来源于stack exchange,提问作者byron
相关产品推荐
相关产品推荐

