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、ループ内のそれぞれのデータフレームウィンドウを手動で閉じる必要はありません。

(私はこの検証の途中でView(snippet)、D:を閉じるのに苦労していない200個のウィンドウを処理しています。また、ウィンドウを開くと、キーボードのフォーカスがプロンプトから奪われるため、Y/と入力します。 Nは思ったほど速くはありませんが、一度だけやればいいので、とりあえずやります。次回は質問の答えが気になります)。

4

2 に答える 2

4

あなたが求めていることを達成するための1つの方法は、system関数を利用することです。たとえば、ウィンドウID /名前を決定してから、次のように閉じるコマンドを発行できます。

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

上記のコマンドは10秒間待機してから、ウィンドウマネージャーにコマンドを発行して、「Data:my_df」という名前のウィンドウを閉じます。これらの2つのコマンドは括弧で囲まれています。これは、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 に答える