29

我正在使用 R 查看数据框View

my_df <- data.frame(a=1:10, b=letters[1:10])
View(my_df)

我现在想以编程方式关闭生成的窗口(而不是单击 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.
}

我基本上想减少凝视图像和数据框片段并输入 Y 或 N 的用户交互,因此他们不必为i循环中的每个手动关闭数据框窗口。

(我自己已经完成了这个验证,并且正在处理 200 个View(snippet)我懒得关闭 D: 的窗口。另外,已经注意到打开窗口会从提示中窃取键盘焦点,所以我输入 Y/ N没有我想要的那么快。但我只需要这样做一次,所以现在就可以了。我很好奇这个问题的答案,下一次)。

4

2 回答 2

4

完成您所追求的一种方法是利用该system功能。例如,您可以确定窗口 ID/名称,然后发出关闭命令,如下所示:

system('(sleep 10; wmctrl -c "Data: my_df") &')

上述命令将等待 10 秒,然后向窗口管理器发出命令以关闭任何名为"Data: my_df"的窗口。这两个命令被包裹在括号中。这在 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)

实现此目的的另一种方法是这样的:

# 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 中打印重复的提示消息。

于 2013-01-26T12:48:51.393 回答
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()是诀窍,我发现在交互工作时特别有用。

于 2018-08-31T12:01:24.163 回答