2016-08-13 111 views
1

如何将大量数据粘贴到R中的剪贴板上?将大量数据粘贴到R中的剪贴板

您可以使用write.table粘贴到剪贴板,或到(略)大128KB剪贴板的Windows,因为NT介绍:

write.table(mtcars, "clipboard-128", sep="\t", row.names=FALSE) 

但是,如果你尝试粘贴一个大的数据帧,您将收到一条错误:

big = data.frame(a=sample(LETTERS, 100000, replace=TRUE), b=rnorm(100000), c=rnorm(100000)) 
write.table(big, "clipboard-128", sep="\t", row.names=FALSE) 

Warning message: 
In .External2(C_writetable, x, file, nrow(x), p, rnames, sep, eol, : 
    clipboard buffer is full and output lost 

有什么方法可以将大量数据以可由其他程序(如Excel)读取的格式存入剪贴板?

+0

你想达到什么样的用例?为什么不提供下载数据到CSV或保存到Excel功能呢? – miraculixx

回答

4

将128更改为16384,警告将消失。你需要增加限制。执行下面的命令后,您可以轻松地直接粘贴到Excel中。

write.table(big, "clipboard-16384", sep="\t", row.names=FALSE) 
0

如果你想粘贴超过128kb的数据,那么你必须做一个字符串。您可以使用writeClipboard(knitr::kable(big))以降价格式粘贴非常大的表格,但这涉及到使用大型软件包并提供了一个包含大量格式化字符的表格。

以下代码使用toString()将data.frame转换为字符串,然后将格式更改为使用换行符间的换行符进行制表符分隔。这使您可以复制大型数据表(最多可以测试10 MB而无任何问题)。

# copy a big data.frame to clipboard 
writeBigClipboard = function(x) 
{ 
    # convert x to a data.frame of char 
    for(col in 1:ncol(x)) 
     x[ , col] = as.character(x[ , col]) 

    # now convert its transpose into a string - so we get c(1st row), c(2nd row), ... 
    x = as.data.frame(t(x), stringsAsFactors=FALSE) 
    x = toString(x) 

    # convert the delimiter from comma to tab 
    x = gsub('\", \"', '\t', x, fixed=TRUE) 

    # convert EOL to a newline character 
    x = gsub('\"), c(\"', '\n', x, fixed=TRUE) 

    # chop off the first c(\" and the last \") 
    x = substr(x, 4, nchar(x)-2) 

    # now paste the goodies into excel 
    writeClipboard(x) 
} 

例子:

big = data.frame(a=sample(LETTERS, 100000, replace=TRUE), b=rnorm(100000), c=rnorm(100000)) 
writeBigClipboard(big) 

这是相当资源密集型不过,也许更有效的解决方案存在?