39

Ubuntu 11.10 を実行していますが、クリップボード (またはプライマリ選択) に書き込めるようにしたいと考えています。以下はエラーになります

> x <- 1:10
> dput(x, 'clipboard')
Error in file(file, "wt") : 'mode' for the clipboard must be 'r' on Unix

クリップボード/プライマリ選択に書き込むにはどうすればよいですか?

この古い R-Help の投稿を見たことがありますが、何をすべきかまだはっきりしていません。

Linux にはクリップボードがありませんが、X11 セッションにはプライマリとセカンダリの選択肢があります。?ファイルは言う

クリップボード:

  'file' can also be used with 'description = "clipboard"' in mode
  '"r"' only.  It reads the X11 primary selection, which can also be
  specified as '"X11_primary"' and the secondary selection as
  '"X11_secondary"'.

  When the clipboard is opened for reading, the contents are
  immediately copied to internal storage in the connection.

  Unix users wishing to _write_ to the primary selection may be able
  to do so via 'xclip' (<URL:
  http://people.debian.org/~kims/xclip/>), for example by
  'pipe("xclip -i", "w")'.

RTFMが適用されました。X11 セレクションへの書き込みには複数のスレッドが必要であり、(Windows の場合とは異なり) 実装にかなりの労力を費やす価値があるとは思いませんでした。

ウィンドウ マネージャには他のクリップボードがある場合があることに注意してください。たとえば、RGtk2 パッケージには gtk クリップボードへのインターフェイスがあります。

4

4 に答える 4

22
clipboard <- function(x, sep="\t", row.names=FALSE, col.names=TRUE){
     con <- pipe("xclip -selection clipboard -i", open="w")
     write.table(x, con, sep=sep, row.names=row.names, col.names=col.names)
     close(con)
}

vec <- c(1,2,3,4)

clipboard(vec)
clipboard(vec, ",", col.names=FALSE)
clipboard(vec, " ", row.names=TRUE)

関数自体を作成した後、クリップボードに書き込んだものを貼り付けることができます。デフォルトでは、タブで区切られた値が列とともに返されますが、行名は返されません。示されているように、他の区切り記号を指定したり、行名を含めたり、列名を除外したりします。

編集:明確にするために、xclipをインストールする必要があります。ただし、最初に個別に開始する必要はありません。

于 2014-01-09T20:49:47.150 に答える
18

これが最善の方法かどうかはわかりませんが、これを機能させる方法は次のとおりです。

  1. xclip をインストールします。sudo apt-get install xclip
  2. マニュアルを読む:man xclip
  3. R で X11 プライマリに書き込みます。write.table(1:10, pipe("xclip -i", "w"))

アップデート:

に渡されたオブジェクトはwrite.table、パイプが閉じられるまでクリップボードに存在しないことに注意してください。を呼び出すことで、パイプを強制的に閉じることができますgc()。例えば:

write.table(1:10, pipe("xclip -i", "w"))  # data may not be in clipboard
gc()                                      # data written to primary clipboard

接続を管理するより良い方法は、 で関数を使用することです。これにより、呼び出しがエラーをスローしたon.exit(close(con))場合でもパイプが閉じられます。write.tableシステム設定に基づいて、使用する予定のクリップボード (プライマリがデフォルト) に書き込んでいることを確認する必要があることに注意してください。

write.xclip <- function(x, selection=c("primary", "secondary", "clipboard"), ...) {
  if (!isTRUE(file.exists(Sys.which("xclip")[1L])))
    stop("Cannot find xclip")
  selection <- match.arg(selection)[1L]
  con <- pipe(paste0("xclip -i -selection ", selection), "w")
  on.exit(close(con))
  write.table(x, con, ...)
}
于 2012-06-09T11:11:12.190 に答える