2016-01-06 26 views
7

Khi tôi in thứ gì đó trực tiếp vào bảng điều khiển (nhập một số tên biến, chẳng hạn như x, thay vì sử dụng chức năng in print(x)), tôi muốn in khác với cách nó thường in. Ý tưởng của tôi là in ấn được thực hiện bởi một số chức năng. Nếu đúng như vậy, tất cả những gì tôi phải làm là thay thế chức năng đó bằng chức năng của riêng tôi. Tuy nhiên, tôi không thể tìm ra chức năng nội bộ thực hiện việc in ấn.Thay đổi cách in ra giao diện điều khiển

Đây là những gì tôi đã thử cho đến nay.

.real_cat = cat 
cat = function(x) .real_cat("*** cat ***", x, "\n") 

cat(2345) 
2345 # no 

In trên bảng điều khiển không được thực hiện qua cat. Điều gì về print?

.real_print = print 
print = function(x) .real_cat("*** print ***", x, "\n") 
print(2345) 
2345 # no 
"hello" # no 
I(2345) # yes 

Một số lớp học, như AsIs, được in để an ủi qua print, nhưng những người khác, như numeric hoặc character thì không. :-(

c("print.numeric", "print.character", "print.AsIs", "print.default") %in% methods("print") 
# FALSE FALSE TRUE TRUE 

Hóa ra print thậm chí không có một phương pháp riêng để in numeric hoặc character. Lớp học đó có một phương pháp print được in ra cửa sổ Console sử dụng print. Nhưng lớp học mà không có một phương pháp print không được. có thể họ được in bằng phương pháp default?

print.default = function(x) .real_cat("*** print.default ***", x, "\n") 
print.default(2345) 
2345 # no 
"hello" # no 

số

có lẽ nếu tôi xác định một phương pháp để số, sau đó nó sẽ in nó bằng cách sử dụng phương pháp đó?

print.numeric = function(x) .real_cat("*** print.numeric ***", x, "\n") 
print.numeric(2345) 
2345 # no 

print.character = function(x) .real_cat("*** print.character ***", x, "\n") 
print.character("hello") 
"hello" # no 

Đây là nơi tôi gặp khó khăn. Tôi không thể tìm ra cách nào để có một số lớp cơ bản như numeric hoặc character in trực tiếp ra bàn điều khiển bằng chức năng in của riêng tôi.

Nếu điều này giúp, đây là lý do tôi muốn thực hiện việc này. Tôi đang viết một gói cho các giá trị in đẹp (https://github.com/prettyprint/prettyprint). Quá nhiều lần, đầu ra của một phân tích quá khó đọc, và do đó hiểu được. Có, bạn có thể làm cho nó đẹp bằng cách sử dụng format, signifround và về cơ bản những gì gói đã làm cho bạn trong nền.

Tôi muốn in ấn dễ dàng nhất có thể cho người dùng. Tại thời điểm này, họ phải gọi chức năng in đẹp của tôi (pp(x)). Tôi muốn chơi xung quanh với cho người dùng tùy chọn để có kết quả khá in tự động. (Tôi sẽ in cả phi xinh đẹp và phiên bản khá giá trị, để đảm bảo không có gì bị mất trong prettifying.)

+0

Một cách giải quyết với các lớp ngầm sẽ có thêm một thuộc tính lớp cho đối tượng và sử dụng một 'phương pháp print'. Ví dụ. 'print.numeric = function (x, ...) cat (" số: \ n ", unclass (x)," \ n "); xx = c (1, 2, 3); xx; attr (xx, "class") = "số"; xx'. Hoặc bạn có thể định nghĩa "class" của riêng bạn và phương thức 'print' của nó. –

Trả lời

6

Xem nhận xét này trong the source:

* print.default() -> do_printdefault (with call tree below) 
* 
* auto-printing -> PrintValueEnv 
*      -> PrintValueRec 
*      -> call print() for objects 
* Note that auto-printing does not call print.default. 
* PrintValue, R_PV are similar to auto-printing. 
* 
* do_printdefault 
* -> PrintDefaults 
* -> CustomPrintValue 
*  -> PrintValueRec 
*   -> __ITSELF__ (recursion) 
*   -> PrintGenericVector -> PrintValueRec (recursion) 
*   -> printList   -> PrintValueRec (recursion) 
*   -> printAttributes  -> PrintValueRec (recursion) 
*   -> PrintExpression 
*   -> printVector  >>>>> ./printvector.c 
*   -> printNamedVector >>>>> ./printvector.c 
*   -> printMatrix  >>>>> ./printarray.c 
*   -> printArray  >>>>> ./printarray.c 

Do đó, tính năng tự động in ấn chỉ có thể liên quan đến việc gửi phương thức cho các lớp rõ ràng (với một thuộc tính lớp, còn gọi là các đối tượng). Tôi giả sử một numeric được xử lý bởi printVector. Vui lòng tự kiểm tra điều này.

I thêm một lớp AsIs (tạo một đối tượng) và sau đó print.AsIs là phái:

class(I(3)) 
#[1] "AsIs" 
+0

Tôi thấy ở đây https://github.com/wch/r-source/blob/trunk/src/main/printvector.c một hàm C gọi là 'printVector'. Làm thế nào để tôi tìm ra hàm R nào gọi nó? – prettyprint

+0

Điều này được xử lý ở cấp độ C. Trừ khi bạn đang in một đối tượng, tự động in không liên quan đến chức năng R. – Roland

Các vấn đề liên quan