我正在使用View
:
my_df <- data.frame(a=1:10, b=letters[1:10])
View(my_df)
我现在想以编程方式关闭生成的窗口(而不是单击X按钮)。
我怎么能这样做? graphics.off
不起作用,因为它不是图形设备。查看View
代码,内部函数dataviewer
用于显示窗口,但我不确定它在后台使用了什么(tcltk?)所以我不确定如何关闭窗口。 / p>
重新评论我为什么要这样做。
我基本上在脚本中执行用户检查步骤,询问用户是否将数据帧的片段和相应的图像放在一起。它是这样的:
for (i in 1:heaps) {
1. View(a snippet of a big dataframe)
2. show an image
3. readline('Is this OK? [Y/N]: ') (store the i for which it's not OK)
4. close the image window (graphics.off()), close the View(..) window.
}
我基本上想减少用户互动,盯着图像&amp;数据帧片段并键入Y或N,因此他们不必手动关闭循环中每个i
的数据帧窗口。
(我自己正在通过这个验证,我正在处理200个View(snippet)
窗口,我没有费心去关闭D:。另外,注意到窗口的打开会窃取键盘焦点从提示中我输入Y / N并不像我想的那么快。但我只需要这样做一次,所以它现在就做了。我很好奇这个问题的答案,对于下一个时间)。
答案 0 :(得分:4)
实现目标的一种方法是使用system
函数。例如,您可以确定窗口ID /名称,然后发出如下所示的关闭命令:
system('(sleep 10; wmctrl -c "Data: my_df") &')
上述命令将等待10秒,然后向窗口管理器发出命令以关闭名称为“Data:my_df”的任何窗口。这两个命令包含在parens中。这在bash中称为复合命令。整个复合命令是背景的,'&amp;'。
我测试了以下内容并且有效:
# sample1.R
my_df <- data.frame(a=1:10, b=letters[1:10])
system('(sleep 10; wmctrl -c "Data: my_df") &')
View(my_df)
实现此目的的另一种方法是:
# sample2.R
my_df <- data.frame(a=1:10, b=letters[1:10])
View(my_df)
system('read -p "Press [Enter] key to start backup..."')
my_df2 <- data.frame(a=1:10, b=letters[1:10])
View(my_df2)
system('read -p "Press [Enter] key to start backup..."')
我正在运行这样的:
R CMD BATCH sample2.R
注意:来自read -p
命令的提示未显示在我的终端中,但您只能在R中打印重复的提示消息。
答案 1 :(得分:2)
如果要关闭所有打开的“查看”窗口,请以slm的答案为基础:
CloseViews <- function(){
cmd <- paste0('wmctrl -c "Data:" -v')
ok <- TRUE
while(ok){
out <- suppressWarnings(system(cmd,intern=TRUE,ignore.stderr=TRUE))
Sys.sleep(0.2)
ok <- is.null(attr(out,"status"))
print(ok)
}
}
然后CloseViews()
完成了技巧,我发现在交互式工作时特别有用。