¿Por qué los R objetos que no se imprima en una función o un ciclo «for»?

Tengo un R de la matriz denominada ddd. Cuando entro en esta, todo funciona bien:

i <- 1
shapiro.test(ddd[,y])
ad.test(ddd[,y]) 
stem(ddd[,y]) 
print(y) 

Las llamadas a Shapiro Wilk, Anderson Darling, y la madre de todo el trabajo, y extraer de la misma columna.

Si puedo poner este código en un ciclo «for», las llamadas a Shapiro Wilk, y Anderson Darling dejar de trabajar, mientras que el de la madre & hoja llamada y la impresión de la llamada continuar trabajando.

for (y in 7:10) {
    shapiro.test(ddd[,y])
    ad.test(ddd[,y]) 
    stem(ddd[,y]) 
    print(y)
}

The decimal point is 1 digit(s) to the right of the |

  0 | 0
  0 | 899999
  1 | 0

[1] 7

Lo mismo ocurre si intento escribir una función. SW & AD no funcionan. El otro se llama hacer.

> D <- function (y) {
+ shapiro.test(ddd[,y])
+ ad.test(ddd[,y]) 
+ stem(ddd[,y]) 
+ print(y)  }

> D(9)

  The decimal point is at the |

   9 | 000
   9 | 
  10 | 00000

[1] 9

¿Por qué no todas las llamadas se comportan de la misma manera?

  • ¿qué es i para – ¿quieres decir y <- 1 en la primera línea?
InformationsquelleAutor Sal Leggio | 2011-01-17

3 Kommentare

  1. 56

    En un bucle, impresión automática está desactivada, ya que es dentro de una función. Usted necesita explícitamente print algo en ambos casos, si usted quiere ver la salida. El [1] 9 cosas que están recibiendo es porque son explícitamente la impresión de los valores de y.

    Aquí es un ejemplo de cómo usted puede ser que desee considerar ir sobre cómo hacerlo.

    > DF <- data.frame(A = rnorm(100), B = rlnorm(100))
    > y <- 1
    > shapiro.test(DF[,y])
    
        Shapiro-Wilk normality test
    
    data:  DF[, y] 
    W = 0.9891, p-value = 0.5895

    Así que tenemos la impresión automática. En el bucle tendríamos que hacer esto:

    for(y in 1:2) {
        print(shapiro.test(DF[,y]))
    }

    Si desea imprimir más pruebas, a continuación, sólo añadir líneas adicionales en el bucle:

    for(y in 1:2) {
        writeLines(paste("Shapiro Wilks Test for column", y))
        print(shapiro.test(DF[,y]))
        writeLines(paste("Anderson Darling Test for column", y))
        print(ad.test(DF[,y]))
    }

    Pero que no es muy atractivo, a menos que te gusta de la lectura a través de páginas y páginas de salida. En su lugar, ¿por qué no guardar el conjunto de los objetos de prueba y, a continuación, que usted puede imprimir y investigar ellos, tal vez incluso su proceso de agregado de la prueba de las estadísticas y los p-valores en una tabla? Usted puede hacer que el uso de un bucle:

    ## object of save fitted objects in
    obj <- vector(mode = "list", length = 2)
    ## loop
    for(y in seq_along(obj)) {
        obj[[y]] <- shapiro.test(DF[,y])
    }

    Luego podemos ver los modelos de uso de

    > obj[[1]]
    
        Shapiro-Wilk normality test
    
    data:  DF[, y] 
    W = 0.9891, p-value = 0.5895

    por ejemplo, o el uso de lapply, que se encarga de configurar el objeto que se usa para almacenar los resultados para nosotros:

    > obj2 <- lapply(DF, shapiro.test)
    > obj2[[1]]
    
        Shapiro-Wilk normality test
    
    data:  X[[1L]] 
    W = 0.9891, p-value = 0.5895

    Decir ahora he querido extraer el W y p-value datos, se puede procesar el objeto de almacenar todos los resultados para extraer los bits que queremos, por ejemplo:

    > tab <- t(sapply(obj2, function(x) c(x$statistic, x$p.value)))
    > colnames(tab) <- c("W", "p.value")
    > tab
              W      p.value
    A 0.9890621 5.894563e-01
    B 0.4589731 1.754559e-17

    O para aquellos con una inclinación de significación de las estrellas:

    > tab2 <- lapply(obj2, function(x) c(W = unname(x$statistic), 
    +                                    `p.value` = x$p.value))
    > tab2 <- data.frame(do.call(rbind, tab2))
    > printCoefmat(tab2, has.Pvalue = TRUE)
           W p.value    
    A 0.9891  0.5895    
    B 0.4590  <2e-16 ***
    ---
    Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

    Esto tiene que ser mejor que el disparo de salida a la pantalla, a continuación, tener que verter a través de?

    • Muchas gracias, Gavin. Yo no sabía que la «impresión» de que se apagara en bucles y funciones. El doc no dije eso. Yo también estaba familiarizado con «y en seq_along(obj)». No sabía que se podía hacer eso! Su respuesta es muy útil.
    • Yo no sabía acerca de ‘printCoefmat’. Genial!!
  2. 38

    No una nueva respuesta, pero además de lo anterior: «al ras.console()» es necesario forzar la impresión de que tenga lugar DURANTE el bucle en lugar de después. Única razón por la que yo uso print() durante un bucle para mostrar el progreso, por ejemplo, de la lectura de muchos archivos.

    for (i in 1:10) {
      print(i)
      flush.console()
      for(j in 1:100000)
        k <- 0
    }
    • Hasta votación para responder a la pregunta indicada en el título. Este debe ser editadas por lo tanto el título de esta pregunta no coincide con la pregunta en sí misma.
    • Hasta votar por el color.console()
  3. 5

    Fantástica respuesta de Gavin Simpson. Tomé el último bit de la magia y la convirtió en una función.

    sw.df <- function ( data ) { 
       obj <- lapply(data, shapiro.test)
       tab <- lapply(obj, function(x) c(W = unname(x$statistic), `p.value` = x$p.value))
       tab <- data.frame(do.call(rbind, tab))
       printCoefmat(tab, has.Pvalue = TRUE)
    }

    A continuación, usted puede llamar con el marco de datos
    sw.df ( df )

    Y si quieres probar una transformación:
    sw.df ( log(df) )

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea