2012-06-02 44 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=", "), ")")))}