2012-06-02 24 views
16

Có lẽ tôi đang tưởng tượng điều này, nhưng tôi nghĩ có một hàm R tích hợp cho phép bạn in một véc tơ R (và các đối tượng khác như ma trận và khung dữ liệu) ở định dạng mà bạn sẽ sử dụng để nhập đối tượng đó (được trả về dưới dạng chuỗi). Ví dụ:Xuất ra một vector trong R theo cùng định dạng được sử dụng để nhập nó vào R

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

Chức năng này có tồn tại không?

+0

Hãy xem 'deparse (x) '. –

Trả lời

22

dput có thể?

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

Bạn cũng có thể dump ra nhiều đối tượng trong một đi vào một tập tin được viết trong thư mục làm việc của bạn:

> 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 sau đó sẽ chứa:

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

tôi quyết định thêm giải pháp này quá vì tôi thấy rằng dput() không hoạt động cho những gì tôi đã cố gắng làm. Tôi có một ứng dụng shiny sử dụng knitr để tạo báo cáo dựa trên phiên người dùng và tôi sử dụng knit_expand() trước khi hiển thị thông số .Rmd của mình cho cổng người dùng từ phiên sáng bóng sang .Rmd.

Nếu không đi sâu vào chi tiết quá nhiều, tôi có nhu cầu đối với vectơ cổng "nguyên trạng", vì chúng sẽ được viết thành dòng mã trong .Rmd mà ai đó sẽ chạy. Đối với trường hợp này, dput() không hoạt động vì đầu ra chỉ nhổ vào bảng điều khiển và phương thức dump() hoạt động nhưng tôi không muốn ghi tệp mới mỗi lần và xóa chúng.

Có thể có cách tốt hơn, nhưng tôi đã viết một hàm trả về đối tượng ký tự của vectơ "nguyên trạng". Nó xử lý cả vectơ số và ký tự (nó ném dấu ngoặc kép xung quanh mỗi thành viên của vector ký tự). Nó cũng xử lý các đầu vào đơn và chỉ trả về chúng như chúng. Nó không đẹp, và tôi chắc chắn có nhiều cách hiệu quả hơn để viết nó, nhưng nó hoạt động hoàn hảo cho nhu cầu của tôi. Nghĩ rằng tôi sẽ thêm giải pháp này vào cuộc xung đột.

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=", "), ")")))} 
Các vấn đề liên quan