2010-10-13 40 views
6

Tôi đang cố gắng sử dụng cat() làm hàm bên trong áp dụng(). Tôi có thể gần như làm cho R làm những gì tôi muốn, nhưng tôi nhận được một số rất khó hiểu (cho tôi) NULLS vào cuối sự trở lại. Đây là một ví dụ ngớ ngẩn, để làm nổi bật những gì tôi nhận được.Làm thế nào để sử dụng áp dụng, mèo và in, mà không nhận được NULL

val1 <- 1:10 
val2 <- 25:34 
values <- data.frame(val1, val2) 
apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE)) 

"hoạt động" này R chấp nhận và chạy, nhưng tôi không hiểu kết quả.

> apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE)) 
1 25 
2 26 
3 27 
4 28 
5 29 
6 30 
7 31 
8 32 
9 33 
10 34 
NULL 

Nhưng, tôi muốn nhận được:

> apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE)) 
1 25 
2 26 
3 27 
4 28 
5 29 
6 30 
7 31 
8 32 
9 33 
10 34 

Vì vậy, làm thế nào để loại bỏ NULL cuối cùng?

+0

Bạn đã nhìn ddply từ gói plyr? –

+0

No. Tôi chưa bao giờ nhận được hang của plyr. Thông thường khi tôi cần thực sự định hình lại dữ liệu, tôi dán các khung dữ liệu vào cơ sở dữ liệu. Không phải là SQL nhất thiết phải tốt hơn, nhưng tôi thường đánh bại thoải mái hơn với Postgres hơn tôi R. – Choens

+0

Tuy nhiên, tôi nên dành thời gian để tìm hiểu cách sử dụng plyr. Tôi đang dành một chút thời gian vào tuần tới cho các công cụ gia đình. Học plyr sẽ cho tôi một cái gì đó để làm vào buổi tối. – Choens

Trả lời

11

NULL là trình thông dịch R in giá trị của biểu thức bạn đã nhập - áp dụng. Bạn có thể gán nó ở đâu đó:

junk = apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE)) 

trong trường hợp này nó sẽ không được in, hoặc bọc nó trong 'vô hình':

invisible(apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE))) 

Lưu ý rằng chỉ có nó khi bạn chạy này một cách tương tác mà mỗi dòng là in, nếu nó ở trong một chức năng bạn sẽ không nhìn thấy nó.

+0

invisible() hoạt động. Tôi cũng phát hiện ra rằng dán() hoạt động theo cách tôi mong đợi. – Choens

+0

Một lưu ý về điều này trong trường hợp ai đó khác dày đặc như tôi: đảm bảo 'invisible()' là cho toàn bộ hàm 'apply()', không chỉ 'cat()'! Đã cho tôi một 15 phút tốt để nhận ra những gì tôi đã làm sai! – CephBirk

0

Bạn có thực sự cần apply() để lặp qua nội dung của mình không?

> print(values, row.names=FALSE) 
val1 val2 
    1 25 
    2 26 
    3 27 
    4 28 
    5 29 
    6 30 
    7 31 
    8 32 
    9 33 
    10 34 
+0

Tôi có cần sử dụng áp dụng cho ví dụ của mình không? - Không. Ví dụ này chỉ là một tình huống đơn giản làm nổi bật vấn đề tôi đang gặp phải. Tôi đang thực sự lấy một loạt các con số, từ các hàng trong một data.frame và cung cấp một cái gì đó hợp lý cho một báo cáo. – Choens

+1

Tôi lo sợ bạn có thể là vấn đề hiểu lầm. Trong một 'apply()' bạn không sử dụng 'cat()' nhưng thay vì slice, dice, aggregate và ... trả về một giá trị. Sự thất bại của bạn để làm như vậy nó ở gốc của màn hình NULL. –

+0

Tôi luôn nghĩ rằng việc sử dụng áp dụng là sử dụng một hàm trên một đối tượng mà không cần sử dụng vòng lặp. Trong trường hợp này, tôi muốn "tổng hợp" bằng cách nối một chuỗi các chuỗi.paste() xuất hiện để làm những gì tôi nghĩ cat() sẽ làm. – Choens

0

Như Dirk đã chỉ ra đây không phải là cách để in điều trong R. Thông thường bạn sẽ gán kết quả cho một biến và sau đó in nó. Không có tác dụng phụ, do đó, để nói.

Sự cố của bạn xuất phát từ các chức năng của mèo, sẽ in ra thiết bị đầu cuối dưới dạng tác dụng phụ, nhưng trả về NULL.

Hãy thử

a <- cat("blabla\n") 
a 

Nếu bạn thực sự muốn sử dụng áp dụng cho in ấn, có hai giải pháp. Quấn vào cuộc gọi vô hình

invisible(apply(values, 1, function(x) invisible(cat(x[1], x[2], fill=TRUE)))) 

hay, chỉ cần gán kết quả (NULL) đến một giá trị tạm thời

t <- apply(values, 1, function(x) invisible(cat(x[1], x[2], fill=TRUE))) 
+0

Quá nhiều ngôn ngữ. Quá ít thời gian. cat() không hoạt động theo cách tôi mong đợi. paste(). Tôi không về mặt kỹ thuật muốn in chúng, tôi chỉ muốn lấy một đống các công cụ và nối nó lại với nhau thành một chuỗi. – Choens

+0

Bài đăng đầu tiên của tôi không được bao gồm in(). Điều đó gây hiểu nhầm về phía tôi. Tôi hiểu lầm việc sử dụng mèo() và thấy rằng dán() xuất hiện để làm việc như tôi muốn. – Choens

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