Подтвердить что ты не робот

Программно закрыть окно, созданное `View (x)`

Я просматриваю dataframe в R, используя View:

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

Я хотел бы закрыть окно, полученное в результате, программным способом (вместо нажатия кнопки X).

Как я могу это сделать? graphics.off не работает, поскольку это не графическое устройство. Глядя на код View, внутренняя функция dataviewer используется для отображения окна, но я не уверен, что он использует в фоновом режиме (tcltk?), Поэтому не уверен, как закрыть окно.


Подумайте о том, почему я хочу этого.

В основном я делаю шаг проверки пользователя в script, в котором пользователю задают вопрос о том, смещен ли фрагмент кадра данных и соответствующее изображение. Это происходит примерно так:

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 not OK)

    4. close the image window (graphics.off()), close the View(..) window.
}

В основном я хотел уменьшить взаимодействие с пользователем, глядя на фрагмент изображения и фреймворка данных и набрав Y или N, поэтому им не нужно вручную закрывать окно данных для каждого i в цикле.

(Я частично прошел эту проверку и имею дело с 200 View(snippet) окнами, которые я не потрудился закрыть D:. Также заметили, что открытие окон крадет клавиатурный фокус вдали от подскажите, чтобы я набирал Y/N не так быстро, как хотелось бы, но мне нужно сделать это только один раз, так что теперь это будет сделано. Мне любопытно ответить на вопрос, хотя в следующий раз).

4b9b3361

Ответ 1

Один из способов добиться того, что вам нужно, - использовать функцию system. Вы могли бы, например, определить идентификатор окна/имя окна и затем выполнить команду закрытия следующим образом:

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

Вышеуказанная команда будет ждать 10 секунд, а затем выдает команде диспетчера окон команду закрыть любое окно с именем "Данные: my_df" . Эти 2 команды завернуты в parens. Это называется Compound Command в 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.