我有一个这样的功能:
fun <- function() {
browser()
is_browsing()
}
我想知道is_browsing()
的代码是什么应该是这样它返回 TRUE
如果当前正在浏览该函数,则控制台将如下所示:> fun()
Called from: fun()
Browse[1]>
debug at #3: is_browsing()
Browse[2]>
TRUE
但是,如果我注释掉 browser()
行,或按 c
停止浏览, is_browsing()
应该返回 FALSE
,像这样:> fun()
Called from: fun()
Browse[1]> c
FALSE
我读过 debuggingState()
和 isdebugged()
但在我的情况下,它们似乎没有多大帮助。真实情况仅供引用,是在我们浏览时更新情节或 View ,但仅当我们正在浏览时,如果我们不是,我只想最终绘制/查看一次,以节省资源。
最佳答案
当您使用浏览器时,提示会显示浏览级别:
浏览[1]、浏览[2]、...
> browser()
Called from: top level
Browse[1]> browser()
Called from: top level
Browse[2]>
此浏览级别在 main.C
中计算作者:browselevel = countContexts(CTXT_BROWSER, 1);
哪里CTXT_BROWSER
是在 defn.h
中定义的常量:CTXT_BROWSER = 16
你可以使用这个内部 countContexts
获取 is_browsing
的函数您正在寻找的信息:is_browsing.cpp
#include <Rcpp.h>
#include <R.h>
#include <Rinternals.h>
using namespace Rcpp;
// [[Rcpp::export]]
int is_browsing() {
return Rf_countContexts(16,1);
}
测试 :library(Rcpp)
sourceCpp('is_browsing.cpp')
test <- function() {
is_browsing()
}
test()
#> [1] 0
browser()
#> Called from: eval(expr, envir, enclos)
test()
#> [1] 1
创建于 2020-08-29 由 reprex package (v0.3.0)如果在函数中调用浏览器也可以工作:
test2 <- function() {
browser()
is_browsing()
}
test2()
Called from: test2()
Browse[1]> n
debug à #3 :is_browsing()
Browse[2]> n
[1] 1
如果您想要 TRUE/FALSE 返回,则 Rcpp 代码将是:#include <Rcpp.h>
#include <R.h>
#include <Rinternals.h>
// [[Rcpp::export]]
Rcpp::LogicalVector is_browsing() {
return Rf_countContexts(16,1) > 0;
}
关于r - 在函数中获取浏览状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63552940/