2012-06-02 47 views
16

也许我正在想象这个,但我认为有一个内置的R函数可以让你打印一个R向量(以及可能的其他对象,如矩阵和数据框)以您用来输入该对象的格式(作为字符串返回)。例如,在R中输出一个与R输入相同格式的向量

> x <- c(1,2,3) 
> x 
[1] 1 2 3 
> magical.function(x) 
"c(1,2,3)" 

此功能是否存在?

+0

看看'deparse(x)'。 –

回答

22

dput也许?

> test <- c(1,2,3) 
> dput(test) 
c(1, 2, 3) 

您还可以一气呵成dump了多个对象是写在你的工作目录中的文件:然后

> test2 <- matrix(1:10,nrow=2) 
> test2 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10 
> dump(c("test","test2")) 

dumpdata.r将包含:

test <- 
c(1, 2, 3) 
test2 <- 
structure(1:10, .Dim = c(2L, 5L)) 
1

我决定添加这个解决方案也是因为我发现dput()不能用于我正在尝试做的事情。我有一个shiny应用程序,它使用knitr根据用户会话制作报告,在使用我的.Rmd将用户参数从闪亮会话导入到.Rmd之前,我使用knit_expand()

没有进入太多细节,我需要按照原样移植向量,因为它们会被写入到某人运行的.Rmd中的代码行中。对于这种情况,dput()不起作用,因为输出只能吐出到控制台,并且dump()方法有效,但我不想每次都写新文件并删除它们。

可能有更好的方法,但是我写了一个函数,它返回“原样”矢量的字符对象。它处理数字和字符向量(它会在字符向量的每个成员周围引发引号)。它也处理单个输入并简单地返回它们。这不是很好,我相信有更有效的方法来编写它,但它完全符合我的需求。以为我会将这个解决方案加入到战斗中。

printVecAsis <- function(x) { 
    ifelse(length(x) == 1, x, 
     ifelse(is.character(x), paste0("c(", paste(sapply(x, function(a) paste0("\'",a,"\'")), collapse=", "), ")"), 
       paste0("c(", paste(x, collapse=", "), ")")))}