以编程方式关闭由`View(x)`创建的窗口

时间:2013-01-16 01:08:20

标签: r

我正在使用View

在R中查看数据框
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并不像我想的那么快。但我只需要这样做一次,所以它现在就做了。我很好奇这个问题的答案,对于下一个时间)。

2 个答案:

答案 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()完成了技巧,我发现在交互式工作时特别有用。