2012-04-02 13 views
7

Tôi thỉnh thoảng thấy rằng sẽ hữu ích khi có được biểu diễn được in của đối tượng R dưới dạng chuỗi ký tự, như hàm repr của Python hoặc số prin1-to-string của Lisp. Liệu một hàm như vậy tồn tại trong R? Tôi không cần nó để làm việc trên các đối tượng phức tạp hoặc kỳ lạ, chỉ cần các vectơ và danh sách đơn giản.R có tương đương với "repr" của Python (hay "prin1-to-string" của Lisp) không?

Chỉnh sửa: Tôi muốn chuỗi mà tôi sẽ phải nhập vào bảng điều khiển để tạo đối tượng giống hệt, chứ không phải đầu ra của print(object).

+7

Có thể bạn đang tìm kiếm 'dput'? –

+0

Hầu hết các đối tượng trong R có phương thức in mặc định thực hiện những gì bạn yêu cầu nếu bạn chỉ cần gọi chúng trên dòng lệnh. '> x <- 1:10' '> x' – Justin

+0

@Justin, ý tôi là tôi muốn biểu diễn rằng tôi sẽ gõ vào giao diện điều khiển R để xây dựng đối tượng, giống như' repr' thực hiện trong Python (đối với các đối tượng được hỗ trợ). –

Trả lời

16

Tôi không quen với các hàm Python/Lisp bạn đã liệt kê, nhưng tôi nghĩ bạn muốn hoặc là dput hoặc dump.

x <- data.frame(1:10) 
dput(x) 
dump("x", file="clipboard") 
+1

Có, dump/dput trông giống như họ làm những gì tôi muốn. Cảm ơn bạn. –

+0

Điều này sẽ làm việc cho các đối tượng R đơn giản (vectơ, ma trận, khung dữ liệu, danh sách những thứ đó, lớp S4), nhưng không thành công cho môi trường và bất cứ thứ gì có môi trường trong đó (đóng cửa, danh sách với các yếu tố môi trường). . – Spacedman

1

Bạn có thể sử dụng capture.output:

repr <- function(x) { 
    paste(sprintf('%s\n', capture.output(show(x))), collapse='') 
} 

Đối với một phiên bản mà không có số dòng một cái gì đó dọc theo những dòng nên làm việc:

repr <- function(x) { 
    cat(sprintf('%s\n', capture.output(show(x))), collapse='') 
} 
+0

Chỉ cần sử dụng 'cat' thay vì in kết quả. Điều đó sẽ loại bỏ các số dòng. –

+1

Tôi không muốn đầu ra của 'in (đối tượng)', tôi muốn chuỗi ký tự mà tôi sẽ nhập vào để tạo đối tượng. –

6

Xem ?evaluate trong gói đánh giá.

CHỈNH SỬA: Áp phích sau được làm rõ trong nhận xét rằng anh ấy muốn các lệnh sẽ tạo lại đối tượng thay vì chuỗi chứa đầu ra print(object). Trong trường hợp đó, evaluate không phải là nội dung mong muốn nhưng dput (như đã được đề cập bởi Joshua Ullrich trong nhận xét và kể từ khi tôi đăng đã được chuyển đến câu trả lời) và dump sẽ hoạt động. recordPlotreplayPlot sẽ lưu trữ và thay thế đồ họa cổ điển trên ít nhất Windows. trellis.last.object sẽ truy xuất đối tượng đồ họa mạng cuối cùng. Cũng lưu ý rằng .Last.value giữ giá trị cuối cùng tại bảng điều khiển tương tác.

1

Tôi đã có cùng một câu hỏi. Tôi đã tự hỏi nếu một cái gì đó được xây dựng trong này hoặc nếu tôi sẽ cần phải viết nó bản thân mình. Tôi không tìm thấy bất kỳ thứ gì được tích hợp sẵn, vì vậy tôi đã viết các chức năng sau:

dputToString <- function (obj) { 
    con <- textConnection(NULL,open="w") 
    tryCatch({dput(obj,con); 
      textConnectionValue(con)}, 
      finally=close(con)) 
} 

dgetFromString <- function (str) { 
    con <- textConnection(str,open="r") 
    tryCatch(dget(con), finally=close(con)) 
} 

Tôi nghĩ rằng điều này thực hiện những gì bạn muốn. Đây là một thử nghiệm:

> rep <- dputToString(matrix(1:10,2,5)) 
> rep 
[1] "structure(1:10, .Dim = c(2L, 5L))" 
> mat <- dgetFromString(rep) 
> mat 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10