Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically close the window created by `View(x)`

Tags:

r

I'm viewing a dataframe in R using View:

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

I'd like to now close the resulting window programmatically (rather than clicking the X button).

How may I do this? graphics.off doesn't work as it isn't a graphics device. Looking at the View code, internal function dataviewer is used to display the window but I'm not sure what it uses in the background (tcltk?) so am not sure how to close the window.


Re some comments as to why I want this.

I'm basically doing a user-checking step in a script whereby the user is asked if a snippet of a dataframe and a corresponding image go together. It goes something like this:

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.
}

I basically wanted to reduce the user interaction down staring at the image & dataframe snippet and typing Y or N, so they don't have to manually close th dataframe window for each i in the loop.

(I'm part-way through this validation myself and am dealing with 200 View(snippet) windows that I haven't bothered to close D:. Also, have noticed that the opening of the windows steals keyboard focus away from the prompt so me typing Y/N is not as fast as I'd like. But I only have to do this once, so it'll do for now. I am curious as to the answer to the question though, for next time).

like image 954
mathematical.coffee Avatar asked Jan 16 '13 01:01

mathematical.coffee


2 Answers

One way to accomplish what you're after is to make use of the system function. You could, for example, determine the Window ID/Name and then issue a close command like so:

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

The above command will wait 10 seconds, and then issue a command to the window manager to close any window with the name "Data: my_df". These 2 commands are wrapped in parens. This is known as a Compound Command in bash. The entire Compound Command is backgrounded, '&'.

I tested the following and it worked:

# sample1.R
my_df <- data.frame(a=1:10, b=letters[1:10])
system('(sleep 10; wmctrl -c "Data: my_df") &')
View(my_df)

Another way to accomplish this is like so:

# 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..."')

I'm running these like this:

R CMD BATCH sample2.R

NOTE: The prompt from the read -p command isn't showing up in my terminal but you could just print a duplicate prompt message in R.

like image 195
slm Avatar answered Oct 14 '22 08:10

slm


If you want to close all open "View" windows, building on the answer of 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)
    }
}

Then CloseViews() does the trick, which I found particularly helpful when working interactively.

like image 37
cmbarbu Avatar answered Oct 14 '22 07:10

cmbarbu