ラクにしたいでR:【RStudio】R Markdownで前のチャンクをコピーする

R Markdownで前のチャンクをコピーする (12/29更新:バックスラッシュを含むチャンクだとうまくコピーできないことがわかり修正) RStudioでR Markdown編集時に直前のチャンクをコピーして楽したい話。 (Quartoドキュメントでも使えた) tidyverseに出会ってRにはまっている。 Rでコードを書いて実行し、結果を残すのにR Markdownはとても便利だ。 試行錯誤しつつ進める際、実行したあとにコードを編集して再度実行することもできるが、 その場合は途中経過の出力が消えてしまう。 そこで前のチャンク内容をコピーして、新たなチャンクとして編集、実行することが非常に多い。 範囲選択してコピーペーストを繰り返していたが、きっとラクな機能が準備されているに違いない。 RStudioでは多くのショートカットキーが用意されている。 メニューの[Tools]-[Keyboard Shortcuts Help] (Alt+Shift+K)で主要なキーショートカットが確認できる。 また、メニューの[Tools]-[Modify Keyboard Shortcuts…]を見ると色々なショートカットが用意されていることがわかる。 しかしチャンクに関するものはほとんどなく、お目当てのものは無かった。 主要なエディタならマクロ機能があるのではと考えたが、それも見つからなかった。 そこで目をつけたのがコードスニペット機能だ。 特定の文字列をタイプするとあらかじめ登録しておいたものに置換してくれる。 調べるとRのコードを埋め込んで実行結果を使えるようだ。 試行錯誤の上、カーソル位置の直前のチャンク内容を出力するコードスニペットを作成することができた。 スニペット <p> カーソル位置の直前のチャンク内容を出力するコードスニペットは以下の通り。 </p> <pre><code>snippet cc `r cc_bq3 &lt;- paste(rep(intToUtf8(96), 3), collapse = "") cc_all &lt;- rstudioapi::getSourceEditorContext() cc_src &lt;- cc_all$contents cc_cpos &lt;- cc_all$selection cc_pos &lt;- cc_cpos[[1]]$range$start cc_srcs &lt;- cc_src[1:cc_pos[["row"]]] cc_exp1 &lt;- paste(c("^", cc_bq3, "\\{.*\\}$"), collapse = "") cc_spos &lt;- tail(grep(cc_exp1, cc_srcs), n = 1) cc_exp2 &lt;- paste(c("^", cc_bq3, "$"), collapse = "") cc_epos &lt;- tail(grep(cc_exp2 , cc_srcs), n = 1) cc_txt &lt;- gsub('\\\\' , '\\\\\\\\', cc_srcs[cc_spos:cc_epos]) paste(cc_txt , collapse = "\n") ` 使い方 コードスニペットをRStudioに登録する メニューの[Tools]-[Edit Code Snippets…]から左のペインでMarkdownを選択し、 右のペインで上のコードをコピペする。 最後の一行 ` までが必要なので忘れないように。 ちなみにこの記号`はback quoteとかbacktickと呼ぶらしい。 シングルクォーテーションと違うので注意。 スニペットを使う R Markdownファイルの編集画面でccとタイプした後、 Shiftを押しながらTABキーでスニペットが展開される。 前にチャンクがなければ何も入力されない(ccが消える) <p id="caption-attachment-3261" class="wp-caption-text"> スニペット編集画面 </p> コードの説明 back quote(`)を直接使わず、intToUtf8(96)を使って”`“を使っている。 スニペットで実行するRのコード内で`を見つけるとそこで実行が止まってしまうため。 バックスラッシュなどでエスケープできないか試したが解決できなかった。 intToUtf8(96)を使うことで回避ができたので、これでヨシとする。 cc_all <- rstudioapi::getSourceEditorContext() 現在のソースエディタの内容を取得する。 cc_src <- cc_all$contents ソースエディタのソース全体を取得する。 cc_cpos <- cc_all$selection cc_pos <- cc_cpos[[1]]$range$start 選択範囲が取得できるらしいが、現在のカーソル位置が返ってくるのでそれを使っている。 cc_srcs <- cc_src[1:cc_pos[["row"]]] 現在のカーソルの行数までのソースを別変数cc_srcsに格納。 cc_exp1 <- paste(c("^", cc_bq3, "\\{.*\\}$"), collapse = "") cc_spos <- tail(grep(cc_exp1, cc_srcs), n = 1) ““`{” ではじまり、“}”で終わる行数を探し、一番最後のものだけ取り出す。(直前のチャンクの開始行数) cc_exp2 <- paste(c("^", cc_bq3, "$"), collapse = "") cc_epos <- tail(grep(cc_exp2 , cc_srcs), n = 1) ““`”である行数を探し、一番最後のものだけ取り出す。(直前のチャンクの終了行数) paste(cc_srcs[cc_spos:cc_epos], collapse = "\n") 直前のチャンクの内容を出力 動作確認環境 OS: Ubuntu 22.04.5 LTS RStudio: RStudio 2024.04.2+764 ...

作成日: 2024年12月22日

qterminalでカーソル色指定できなかったのでxfce4-terminalに乗り換えた

軽量のLinux OSであるlubuntuを小型ノートPCに入れて遊んでいる。 lubuntuにはターミナルソフトとしてデフォルトでqterminalが入っている。 qterminalでは設定できるものが少なく、カーソルの形状が変えられるものの、 点滅の設定や色の設定は変えられないようだ。 困ったのが、qterminalでサーバ接続後、emacsのorg-modeでhidestarsを設定している場合に、 見出しの頭にカーソルを合わせるとカーソルが表示されない。 画面からカーソルが消えてしまったように見えて非常に不便だ。 どうやら見出しの*を消す仕組みとしてbackgroundカラーとforegroundカラーを一緒にして消えているように見せているようなのだが、 カーソルの色の設定がない場合、カーソルの色がbackgroundカラーと同じになるようで、見出しの星と同様にカーソルまで消えてしまうらしい。 カーソルの色を設定してあげれば解決するようだが、qterminalでは設定画面が無く、簡単には解決できなそうだった。 そこで、代わりとして追加でxfce4-terminalをインストールした。 こちらも軽量なターミナルソフトで、追加で10Mほどだった。 こちらは設定画面からカーソルの色や点滅も設定できる。 カーソルの背景色を白に、形状をI-Beam、カーソル点滅をONにすることでカーソルが消えること無く、思い通りの表示となった。 xfce4-terminalは起動時に–maximizeオプションをつければ最大化状態で起動ができる。 –fullscreenをつければフルスクリーン表示での起動も可能。 しばらくxfce4-terminalを使ってみようと思う。 それにしても名前を覚えづらい。 Wikipediaを見たら名前の由来はXForms Common Environmentから来ていてその略らしい。 少しは覚えやすくなった。気がする。

作成日: 2024年5月19日