2010-10-13 3 views
6

Sto tentando di utilizzare cat() come funzioni all'interno di apply(). Posso quasi far sì che R faccia ciò che voglio, ma alla fine del ritorno ottengo dei NULL molto confusi (per me). Ecco un esempio sciocco, per evidenziare quello che sto ottenendo.Come utilizzare applicare, cat e stampare, senza ottenere NULL

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

Questo "funziona" in quella R lo accetta e funziona, ma non capisco i risultati.

> 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 

Ma, voglio ottenere:

> 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 

Allora, come faccio a rimuovere che NULL finale?

+0

hai guardato ddply dal pacchetto plyr? –

+0

No. Non ho mai ottenuto il blocco di plyr. Di solito quando ho bisogno di rimodellare veramente i dati, inserisco i frame di dati in un database. Non che SQL sia necessariamente migliore, ma spesso mi sento più a mio agio contro Postgres di quanto lo sia io. R. – Choens

+0

Tuttavia, dovrei prendere il tempo per imparare come usare plyr. Mi sto prendendo un po 'di tempo libero la prossima settimana per roba di famiglia. Imparare il plyr mi avrebbe dato qualcosa da fare la sera. – Choens

risposta

11

Il NULL è l'interprete R che stampa il valore dell'espressione immessa dall'utente - l'applicazione. Si sia possibile assegnare da qualche parte:

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

nel qual caso non otterrete stampato, o avvolgerla in un 'invisibile':

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

Si noti che il suo solo quando si esegue questo modo interattivo che ogni linea è stampato, se è in una funzione non lo vedrai.

+0

invisible() funziona. Ho anche scoperto che paste() funziona nel modo in cui me lo aspettavo. – Choens

+0

Una nota su questo nel caso in cui qualcun altro sia tanto denso quanto me: assicurati che 'invisible()' sia per l'intera funzione 'apply()', non solo 'cat()'! Mi ci sono voluti 15 minuti per capire cosa stavo facendo male! – CephBirk

0

Ti serve davvero lo apply() per scorrere i tuoi contenuti?

> 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

Devo usare apply per il mio esempio? - No. L'esempio è solo una situazione semplificata che evidenzia il problema che sto avendo. In realtà sto prendendo un sacco di numeri, da file in un data.frame e fornendo qualcosa di sensato per un report. – Choens

+1

Temo che potresti essere frainteso. In un 'apply()' non si usa 'cat()' ma piuttosto slice, dice, aggrega e ... restituisce un valore. La tua incapacità di farlo è alla radice del display NULL. –

+0

Ho sempre pensato che l'uso di apply fosse usare una funzione su un oggetto senza usare un loop. In questo caso, voglio "aggregare" concatenando un gruppo di stringhe.paste() sembra fare quello che pensavo che cat() avrebbe fatto. – Choens

0

Come ha fatto notare Dirk, questo non è il modo di stampare le cose in R. Normalmente si assegnerebbe il risultato a una variabile e quindi si stamperebbe. Nessun effetto collaterale, per così dire.

Il tuo problema deriva dalle funzioni cat, che vengono stampate sul terminale come effetto collaterale, ma restituisce NULL.

Prova

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

Se davvero si vuole utilizzare applicare per la stampa, ci sono due soluzioni. Avvolgere nella chiamata invisibile

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

o, semplicemente assegnare il risultato (NULL) per un valore temporaneo

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

Troppe lingue. Troppo poco tempo. cat() non ha funzionato come mi aspettavo. paste() fa. Non voglio tecnicamente stamparli, voglio solo prendere un mucchio di cose e concatenarle insieme in una stringa. – Choens

+0

Il mio post iniziale non avrebbe dovuto includere print(). Questo è stato fuorviante da parte mia. Ho frainteso l'uso di cat() e trovo che paste() sembra funzionare come voglio io. – Choens