如何通过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
相关产品推荐
相关产品推荐

