将R脚本产生的图形留在屏幕上直到用户交互。

7
我有一个R脚本,它查询数据库,运行一些分析,并根据当前系统日期绘制几个图表。我希望每天在启动时运行此脚本,我认为可以使用rscript.exe的快捷方式和必要参数来实现这一点。这很好用,但是脚本在运行后就退出了,对于查看图表来说并不太有用。我正在使用XP和win7。有没有一种简单的方法可以保持脚本的输出屏幕上?我尝试将scan合并到脚本中,但它不会暂停。我知道我可以打开rgui,并运行一行代码,但计划将其部署到完全不熟悉R的同事的计算机上。

可以将输出保存为图形文件(例如PNG),并使用适当的查看器在屏幕上弹出吗? - Ben Bolker
1
将此与Latex结合(可能使用Sweave,也可以不用我认为)将允许您生成报告的PDF。 - Paul Hiemstra
很遗憾,我对 LaTeX 不太熟悉(但会去看一下),而图像查看器似乎不是一个非常稳健的解决方法(即,有人安装了某些相机软件,就会导致一切崩溃)。 我想知道批处理文件是否能够帮忙,尝试编写了一个,但 r 脚本仍然在退出时退出并关闭了图形窗口。 不过还是感谢您提供的思路。 - BetaScoo8
2
或者在 Web 浏览器中打开图形文件(你可能对 brew 包感兴趣,比 LaTeX 更简单)? - Ben Bolker
4个回答

9

这个在Linux系统上对我有用:

#!/usr/bin/env Rscript

X11()
with(mtcars, plot(mpg, hp))
locator(1)

用户需要在绘图窗口消失之前点击它。我认为在Windows上使用 windows()调用也可以实现此功能。

脚本实际上调用了windows() 4次,但不幸的是当脚本退出时它们都关闭了。我尝试使用locator(),但要么我点击得不够快,要么它不起作用。 - BetaScoo8
它应该保持绘图窗口一直打开,直到用户点击。很抱歉它对你不起作用。 - Michael Hoffman
啊,好的,可能是我实现的方式有问题。谢谢。 - BetaScoo8
我意识到其中一个函数没有从数据库返回任何数据并且抛出了一个错误,这阻止了定位器(1)方法的工作。现在它已经可以正常工作了,非常感谢。 - BetaScoo8

2
如何使用Sys.sleep(1e30)?这将等待足够长的时间。

用户必须关闭窗口或按下Esc键或Ctrl键加其他键才能将其关闭。 - Spacedman
要在Windows上使其工作,只需使用Sys.sleep(10000),实际上,1e30没有任何效果(Windows 8 64位)。 - pommedeterresautee

2

Michael的解决方案可能已经可行了,但是这里有一些内容可以在tkrplot框架中显示绘图。 tkrplot包(在CRAN上)使用tcltk扩展到R,并且可以在任何地方使用。

# From https://dev59.com/VE7Sa4cB1Zd3GeqP4IAp
#     r-building-a-simple-command-line-plotting-tool-
#     capturing-window-close-events

require(tcltk)
library(tkrplot)

## function to display plot, called by tkrplot and embedded in a window
plotIt <- function(){ plot(x=1:10, y=1:10) }
tt <- tktoplevel()       ## create top level window event handler
done <- tclVar(0)        ## variable to wait on    
## bind to the window destroy event, set done variable when destroyed
tkbind(tt,"<Destroy>",function() tclvalue(done) <- 1)
## Have tkrplot embed the plot window, then realize it with tkgrid
tkgrid(tkrplot(tt,plotIt))
tkwait.variable(done)    ## wait until done is true
## script continues, or exits, ... once plot is closed

如果您查看R的tcltk文档,您会发现其他带有“确定”按钮等的示例。


1

好的,我本来打算完全抱怨一下我看到的所有类似问题的答案,因为它们都无法在Windows上运行。readline、tkwait.window、Sys.sleep(1e30)、while(TRUE),这些都没有用。

但是我刚刚将R更新到v3.1.0,现在tkwait.window(yourmainwindow)可以工作了,while(TRUE){}也可以工作了,尽管Sys.sleep(1e30)仍然不起作用。

没关系...我正在使用tkwait.window,因为它是tk,可以等待我的窗口(这正是我想要的)。

使http://www.sciviews.org/_rgui/tcltk/OKtoplevel.html中的示例代码工作...(为简洁起见删除了注释)

require(tcltk)
tt <- tktoplevel()
OK.but <- tkbutton(tt, text = "OK", command = function() tkdestroy(tt))
tkgrid(OK.but)
tkfocus(tt)
tkwait.window(tt) # <-- added this to make the window stay!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接