如何交互使用非标准图形设备?

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

问题

在 RStudio 之外运行 R 时,绘图将默认显示在弹出窗口中,例如由 macOS 上的 quartz

 设备、Unix 上的 
X11
 设备、Windows 上的 
windows
 设备提供。

这些“交互式”设备的一个特殊功能是,手动调整绘图窗口的大小会导致重新绘制绘图以适应新的尺寸。这个功能真的太实用了!

默认交互设备的一个缺点是速度相对较慢。 {ragg} 包提供了替代图形设备,例如

ragg::agg_png()

,其渲染速度明显比默认设备快,而且通常看起来也更好。不幸的是,这些设备无法响应调整大小 - 您必须在渲染之前手动指定绘图的尺寸。

在 RStudio 中,可以交互地使用 {ragg} 作为后端。在这种情况下,绘图预览由 {ragg} 渲染,调整窗格大小会导致预览重新渲染。我认为这是由 RStudio 魔法在幕后提供支持的,而不是由 R 提供支持。

我想要什么

我想使用 RStudio 之外的自定义设备

实现自动调整大小。我希望我的绘图由 {ragg} 渲染/绘制,出现在浮动窗口中,并在调整此窗口大小时重新绘制。 我尝试过的事情

我希望默认的

quartz

设备允许我指定一个后端来绘制绘图本身,但我认为这是不可能的。

我能够使用系统默认的 png 查看器创建由 {ragg} 驱动的交互式设备的模仿 - 这种方法的主要缺点是当我调整窗口大小时不会重新绘制绘图:

options(device = function() { file <- tempfile("last_plot_", fileext = ".png") ragg::agg_png(file, height = 480 * 5, width = 480 * 5, scaling = 5) withr::defer( { dev.off() browseURL(file) }, sys.frame(1) ) })

我当前的设置是使用 VS Code,但我从你的问题推断你想使用更轻量级的编辑器/REPL。 
r graphics ragg
1个回答
3
投票

httpgd 很好地集成,请参阅此支持页面。他们为您提供此代码片段 .Rprofile:

if (interactive() && Sys.getenv("TERM_PROGRAM") == "vscode") {
  if ("httpgd" %in% .packages(all.available = TRUE)) {
    options(vsc.plot = FALSE)
    options(device = function(...) {
      httpgd::hgd(silent = TRUE)
      .vsc.browser(httpgd::hgd_url(history = FALSE), viewer = "Beside")
    })
  }
}

当更改为以下内容时,给了我一个很好的可点击(至少在 iTerm 中)URL:
if (interactive() && Sys.getenv("TERM_PROGRAM") == "iTerm.app") {
  httpgd_installed <- try(find.package("httpgd"), silent = TRUE)
  if (!inherits(httpgd_installed, "try-error")) {
    options(device = function(...) {
      httpgd::hgd(silent = TRUE)
      message("httpgd running at: ", httpgd::hgd_url(history = FALSE))
    })
  }
}

示例会话:
> plot(1:10, 1:10*3)
httpgd running at: http://127.0.0.1:58930/live?history=FALSE&token=zsHkpKzo
> plot(1:10, 1:10*3)
> httpgd::hgd_close()
null device
          1
> plot(1:10, 1:10*3)
httpgd running at: http://127.0.0.1:58948/live?history=FALSE&token=CEQRWBS1

ps:
radian
REPL 是 VS Code 扩展也依赖的裸 R REPL 的一个很好的替代品。值得一看。

© www.soinside.com 2019 - 2024. All rights reserved.