如何在R中的Ubuntu/Linux上写入剪贴板?

Jer*_*lim 32 r

我正在运行Ubuntu 11.10,我希望能够写入剪贴板(或主要选择).以下是错误

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

如何写入剪贴板/主要选择?

请注意,我已经看过这个旧的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")'.
Run Code Online (Sandbox Code Playgroud)

所以RTFM应用了.写入X11选择需要多个线程,我认为不值得付出相当大的努力(与Windows不同).

请注意,窗口管理器可能有其他剪贴板,例如RGtk2包具有gtk剪贴板的接口.

Fre*_*ube 20

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)
Run Code Online (Sandbox Code Playgroud)

在创建函数后,您可以将写入的任何内容粘贴回剪贴板.默认值返回制表符分隔的值与列但没有行名称.根据您的喜好指定其他分隔符,包括行名称或排除列名称,如图所示.

编辑:为了澄清,您仍然需要安装xclip.不过,您不需要先单独启动它.


Jos*_*ich 16

不确定这是否是最好的方法,但这是我如何让它工作:

  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
Run Code Online (Sandbox Code Playgroud)

管理连接的更好方法是使用一个函数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, ...)
}
Run Code Online (Sandbox Code Playgroud)

  • 也不适合我(Linux Mint 18,基于 Ubuntu 16.04)。 (2认同)

Tho*_*eld 6

clipr软件包使此操作非常容易

x <- 1:10
clipr::write_clip(x)
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最简单的解决方案。 (2认同)