2010-10-13 8 views
6

Estoy tratando de usar cat() como funciones dentro de apply(). Puedo casi hacer que R haga lo que quiera, pero estoy obteniendo NULLS muy confusos (para mí) al final de la devolución. Aquí hay un ejemplo tonto, para resaltar lo que estoy obteniendo.Cómo usar apply, cat e print, sin obtener NULL

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

Esto "funciona" en que R lo acepta y se ejecuta, pero no entiendo los resultados.

> 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 

Pero, quiero llegar:

> 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 

Así que, ¿Cómo se quita que NULL final?

+0

¿Has mirado en ddply del paquete plyr? –

+0

No. Nunca me he acostumbrado a plyr. Por lo general, cuando necesito cambiar la forma de los datos, pego los marcos de datos en una base de datos. No es que SQL sea necesariamente mejor, pero a menudo me siento más cómodo golpeando a Postgres que con R. – Choens

+0

Sin embargo, debo tomarme el tiempo para aprender a usar plyr. Me tomaré un tiempo libre la próxima semana para cosas familiares. Aprender Plyr me daría algo que hacer por la tarde. – Choens

Respuesta

11

El nulo es el intérprete de R imprimir el valor de la expresión que ha escrito en - la aplican. Puede asignar alguna parte:

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

en cuyo caso no conseguirá impreso, o envolverlo en 'invisible':

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

Tenga en cuenta que es solo cuando se ejecuta este interactiva que cada línea es impreso, si está en una función no lo verá.

+0

invisible() funciona. También descubrí que paste() funciona de la manera que esperaba. – Choens

+0

Una nota sobre esto en caso de que alguien más sea tan denso como yo: asegúrese de que 'invisible()' es para toda la función 'apply()', no solo 'cat()'! ¡Me llevó unos buenos 15 minutos darme cuenta de lo que estaba haciendo mal! – CephBirk

0

¿Realmente necesita el apply() para recorrer su contenido?

> 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

¿Debo usar aplicar para mi ejemplo? - No. El ejemplo es solo una situación simplificada que resalta el problema que estoy teniendo. De hecho, estoy tomando un montón de números, de filas en un data.frame y proporcionando algo sensato para un informe. – Choens

+1

Me temo que puedes estar malentendiendo cosas. En un 'apply()' no usas 'cat()' sino que slice, dice, agrega y ... devuelve un valor. Su falla al hacerlo en la raíz de la pantalla NULL. –

+0

Siempre pensé que el uso de aplicar era usar una función en un objeto sin usar un bucle. En este caso, quiero "agregar" concatenando un montón de cadenas.pegar() parece hacer lo que pensé que cat() haría. – Choens

0

Como Dirk señaló que esta no es la forma de imprimir cosas en R. Habitualmente asignaría el resultado a una variable y luego lo imprimiría. Sin efectos secundarios, por así decirlo.

Su problema proviene de las funciones de gato, que imprime en el terminal como un efecto secundario, pero devuelve NULL.

Trate

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

Si realmente desea utilizar para la impresión se aplica, hay dos soluciones. Envolver en llamada invisible

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

o, simplemente asignar el resultado (NULL) a un valor temporal

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

Demasiados idiomas. Muy poco tiempo. cat() no funcionó como yo esperaba. pegar() hace. Técnicamente, no quiero imprimirlos, solo quiero tomar un montón de cosas y concatenarlas juntas en una cadena. – Choens

+0

Mi publicación inicial no debería haber incluido print(). Eso fue engañoso de mi parte. No entendí el uso de cat() y descubrí que paste() parece funcionar como yo quiero. – Choens

Cuestiones relacionadas