Программно закрыть окно, созданное `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 не так быстро, как хотелось бы, но мне нужно сделать это только один раз, так что теперь это будет сделано. Мне любопытно ответить на вопрос, хотя в следующий раз).
Ответы
Ответ 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.