在R中将大量数据复制到剪贴板

5

如何在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)能够读取?

你想要实现什么特定的用例呢?为什么不提供下载数据到CSV或保存到Excel的功能呢? - miraculixx
2个回答

10

把128改为16384,警告将消失。您需要增加限制。执行以下命令后,您可以直接在Excel中粘贴。

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

-1

如果您想要粘贴超过128kb的数据,那么您必须将其作为字符串处理。您可以使用writeClipboard(knitr::kable(big))以markdown格式粘贴非常大的表格,但这涉及使用一个大型包并且会产生带有许多格式字符的表格。

下面的代码使用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)

这需要相当多的资源,也许存在更有效的解决方案?


这比必要的要复杂得多。 - Dylan Cross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接