首页 > 解决方案 > 如何在我的环境中识别 activeBindings 而无需执行它们?

问题描述

这是一个示例 activeBinding:

invisible(makeActiveBinding('newdev', function(...) {library(grDevices); dev.new(width = 5,height=5,restoreConsole=T)},.GlobalEnv))     

我要解决的问题是,当我将它用作参数时,各种函数会导致该项目执行。例子包括

class(newdev)   
typeof(newdev)

这些都返回“NULL”,但在newdev执行过程中,创建了一个不需要的新图形窗口。(这是一个小烦恼;我想使用的其他绑定在错误的时间调用时会执行更灾难性的操作)相比之下, ls()返回所有内容的名称,包括"newdev"不执行它的元素。

为了执行各种其他任务,我希望能够执行“ls(everything_not_a_activeBinding)”之类的操作来获取我的所有对象,除了用于某些操作的 activeBindings(save.image()例如,也许)。

背景:据我所知,使用 activeBinding 是发出函数调用的唯一方法,而无需()在函数名称后键入。如果我错过了一些不涉及绑定的明显方法,请告诉我。

标签: renvironment

解决方案


使用bindingIsActive

makeActiveBinding("quux", local({i <- 0; function(...) { message("Hello! ", i); i <<- i + 1L; } }), env = .GlobalEnv)
quux
# Hello! 0
quux
# Hello! 1
class(quux)
# Hello! 2
# [1] "numeric"
sapply(ls(), bindingIsActive, .GlobalEnv)
#                quux some_magic_function 
#                TRUE               FALSE 
Filter(function(x) !bindingIsActive(x, env = .GlobalEnv), ls())
# [1] "some_magic_function"

推荐阅读