我正在使用View
以下方法查看R中的数据框:
my_df <- data.frame(a=1:10, b=letters[1:10])
View(my_df)
Run Code Online (Sandbox Code Playgroud)
我现在想以编程方式关闭生成的窗口(而不是单击X按钮).
我怎么能这样做?graphics.off
不起作用,因为它不是图形设备.看View
代码,内部函数dataviewer
用于显示窗口,但我不确定它在后台使用了什么(tcltk?)所以我不知道如何关闭窗口.
重新评论我为什么要这样做.
我基本上在脚本中执行用户检查步骤,询问用户是否将数据帧的片段和相应的图像放在一起.它是这样的:
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.
}
Run Code Online (Sandbox Code Playgroud)
我基本上想要减少用户交互,盯着图像和数据帧片段并键入Y或N,这样他们就不必手动关闭i
循环中的每个数据帧窗口.
(我正在通过这个验证自己处理并正在处理200个View(snippet)
窗口,我没有打扰关闭D:.另外,注意到窗口的打开窃取键盘焦点远离提示,所以我键入Y/N并不像我想的那么快.但我只需要这样做一次,所以它现在就做了.我很好奇这个问题的答案,但下次还是这样.
完成您所追求的任务的一种方法是使用该system
功能。例如,您可以确定窗口 ID/名称,然后发出关闭命令,如下所示:
system('(sleep 10; wmctrl -c "Data: my_df") &')
Run Code Online (Sandbox Code Playgroud)
上面的命令将等待 10 秒,然后向窗口管理器发出命令以关闭任何名为“Data: my_df”的窗口。这 2 个命令包含在括号中。这在 bash 中称为复合命令。整个复合命令都是后台的“&”。
我测试了以下内容并且它有效:
# sample1.R
my_df <- data.frame(a=1:10, b=letters[1:10])
system('(sleep 10; wmctrl -c "Data: my_df") &')
View(my_df)
Run Code Online (Sandbox Code Playgroud)
另一种实现此目的的方法如下:
# 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..."')
Run Code Online (Sandbox Code Playgroud)
我像这样运行这些:
R CMD BATCH sample2.R
Run Code Online (Sandbox Code Playgroud)
注意:命令的提示read -p
未显示在我的终端中,但您可以在 R 中打印重复的提示消息。