通过剪贴板在R和Excel之间移动数据

这些说明是用来解释如何通过剪贴板移动R和Excel以及其他Windows应用之间的数据。

writeClipboard

R里有个writeClipboard函数,正如它的名字那样可以把数据写到剪贴板上。无论如何,writeClipboard函数的参数需要被转化为字符型。例如下面的代码。

x <- 'hello world'
writeClipboard(x)

如同预期的那样,已经把”hello world”复制到了剪贴板上。

x <- 3.14
writeClipboard(x)

上面的代码会产生错误信息提示。

Error in writeClipboard(str, format) : 
  argument must be a character vector or a raw vector

解决方法使用 writeClipboard(as.character(x)),把对象x转化为字符串。

在R中所有的变量都是向量,向量的元素可以有不同的类型。如果向量中的一个元素时字符串,根本不需要使用as.character来转化,所有元素都将被转化为字符串。一个向量复制到剪贴板上之后,在粘贴到文件当中时,向量的元素使用新行进行分隔。

readClipboard

与writeClipboard函数同时使用的是readClipboard函数。

命令如下,

x <- readClipboard()

这个命令将把剪贴板的内容赋值给向量x。每一行是向量的一个元素。这个向量将会转化成字符串,即使在readClipboard命令执行之前粘贴版是一列数字。如果你从Excel中选取了一块数字,每一列将是一个单独的字符串,单元格的边界用tabs表示。

scan

你能够使用scan函数来拷贝一列数字从Excel到R中(译者注:当从Excel复制多列数字拷贝到R时,所有列数字会转化成一列)。从Excel中复制列,接着运行 x <- scan(),通过Ctrl+v粘贴到R中,最后按回车键表明scan输入结束。x包含从Excel中的数字,并且它视为数字型,而非字符型。需要注意的是scan只能处理数字列。如果拷贝的列包含字符串,R将产生错误信息提示。如果存在一个空单元格,那么只有第一个空单元格上面的数字被拷贝到R向量当中。

提醒一下,scan处理的是Excel中的列。如果你使用scan从Excel中拷贝一行数字,在R中这行数字将被转化为成一个数字。例如,你从水平相邻的单元格中复制19和44,运行x <- scan(),接着x将变为1944。为了从excel中复制一行,首先需要在Excel中把行转化为列,然后再复制这一列。(译者注:并不像作者所说呢那样,scan函数也可以直接处理行)

scan()函数并不只能用在Excel当中。也能从其他应用中复制粘贴列数据,如Word或者Notepad。

read.table和write.table

上面那些函数能能处理数据的列,行被合并在一起输入。为了能够移动一块单元格,可以使用read.table和write.table。

代码write.table(x, ‘clipboard’, sep = ‘\t’)将复制一个数据表到剪贴板中,通过这样的方法在保留数据表结构的情况下粘贴到Excel中。默认情况下,行和列表会和数据表的内容一并输出。为了去掉行名,可以在使用write.table函数时添加参数row.names=FALSE。

write.table(x, "clipboard", sep="\t", row.names=FALSE)

同样地,如果你不想要列名拷贝到Excel中,你可以添加cow.names=FALSE。

write.table(x, "clipboard", sep="\t", row.names=FALSE, cow.names=FALSE)

- - - - - -

本文翻译《Moving data between R and Excel via the clipboard》

Previous     Next Xu Kuang /
Published under (CC) BY-NC-SA in categories 技术篇  tagged with R  Rweekly