You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过dev相关方法检查R函数是否存在绘图副作用?

检测R函数是否存在绘图副作用的方案

我们需要判断一个R函数是否会产生绘图副作用,这里借助dev.*系列函数来实现检测。因为inherits仅适用于ggplot2这类返回可复用绘图对象的场景,而像boxplot返回列表、plot返回NULL的函数,无法通过返回值类型判断,必须基于绘图设备(dev)的状态变化来检测。

以下是测试用的绘图函数列表和非绘图函数列表:

input_plots <- list(
  function() print(ggplot2::qplot(1)),
  function() lattice::densityplot(1),
  function() grid::grid.draw(ggplotify::as.grob(lattice::densityplot(1))),
  function() plot(1),
  function() boxplot(2),
  function() hist(1)
)

input_noplots <- list(
  function() list(),
  function() NULL,
  function() 2,
  function() NA
)

实现is_draw函数

下面的is_draw函数通过检查执行函数前后绘图设备的变化来判断是否产生了绘图:

is_draw <- function(f) {
  try(dev.off(), silent = TRUE)
  cdev <- dev.cur()
  f()
  if (cdev != dev.cur()) {
    on.exit(dev.off())
    return(TRUE)
  }
  return(FALSE)
}

验证方案

运行以下代码验证is_draw函数是否符合预期:

all(vapply(input_plots, is_draw, FUN.VALUE = logical(1)))
all(vapply(input_noplots, Negate(is_draw), FUN.VALUE = logical(1)))

内容的提问来源于stack exchange,提问作者polkas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:50:27