如何在不执行环境中识别activeBindings?

问题描述 投票:1回答:1

这是一个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是唯一一种不用键入函数调用的方式。据我所知,使用activeBinding是唯一一种不需要键入一个函数调用的方法。() 后面的函数名。如果我错过了一些不涉及绑定的明显方法,请告诉我。

r environment
1个回答
2
投票

使用 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"
© www.soinside.com 2019 - 2024. All rights reserved.