2011-01-17 7 views
46

Mam macierz R o nazwie ddd. Kiedy wchodzę to wszystko działa poprawnie:Dlaczego obiekty R nie są drukowane w funkcji lub pętli "for"?

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

Połączenia do Shapiro Wilka Anderson Darling, a wynikają wszystkie prace i wyodrębnić samą kolumnę.

Po umieszczeniu tego kodu w pętli "dla", połączenia z Shapiro Wilk i Anderson Darling przestaną działać, podczas gdy połączenie z numerem macierzystym & i wywołanie drukowania będą nadal działać.

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 

To samo dzieje się, gdy próbuję napisać funkcję. SW & AD nie działają. Inne połączenia mają.

> 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 

Dlaczego nie wszystkie połączenia zachowują się tak samo?

+0

co to jest "i" - czy miałeś na myśli "y <- 1" w pierwszym wierszu? –

Odpowiedz

50

W pętli automatyczne drukowanie jest wyłączone, ponieważ znajduje się wewnątrz funkcji. W obu przypadkach musisz jawnie wpisać print, jeśli chcesz zobaczyć dane wyjściowe. Dostarczane rzeczy to [1] 9, ponieważ wyraźnie drukujesz wartości y.

Oto przykład tego, jak warto rozważyć wykonanie tej czynności.

> 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 

Mamy więc druk automatyczny. W pętli musielibyśmy to zrobić:

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

Jeśli chcesz wydrukować więcej testów na zewnątrz, a potem po prostu dodać je jako dodatkowe linie w pętli:

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])) 
} 

Ale to nie jest bardzo atrakcyjne, chyba że lubisz czytać rózne wyjścia. Zamiast tego, dlaczego nie zapisać dopasowanych obiektów testowych, a następnie można je wydrukować i zbadać, a może nawet przetworzyć je, aby zebrać statystyki testu i wartości p do tabeli? Można to zrobić za pomocą pętli:

## 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]) 
} 

Możemy spojrzeć na modelach stosując

> obj[[1]] 

    Shapiro-Wilk normality test 

data: DF[, y] 
W = 0.9891, p-value = 0.5895 

na przykład, albo przy użyciu lapply, która dba o utworzenie obiektu używamy do zapamiętywania wyniki dla nas

> obj2 <- lapply(DF, shapiro.test) 
> obj2[[1]] 

    Shapiro-Wilk normality test 

data: X[[1L]] 
W = 0.9891, p-value = 0.5895 

teraz powiedzieć chciałem wyodrębnić dane z W i p-value możemy przetworzyć obiekt przechowujący wszystkie wyniki EXT ract bity chcemy np

> 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 

Albo dla tych, z zamiłowaniem do gwiazdek istotności:

> 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 

To ma być lepszy niż wypalanie wyjście do ekranu, który następnie trzeba wlać przez?

+0

Wielkie dzięki, Gavin. Nie wiedziałem, że "print" został wyłączony w pętlach i funkcjach. Doktor tego nie powiedział. Nie byłem również zaznajomiony z "y in seq_along (obj)". Nie wiedziałem, że możesz to zrobić! Twoja odpowiedź jest bardzo pomocna. –

+0

Nie wiedziałem o "printCoefmat". Wspaniały!! – Rodrigo

32

Nie nowa odpowiedź, ale oprócz powyższego: "kolor.Konsola()”jest konieczne, aby wymusić drukowanie odbędzie się podczas pętli zamiast po. Jedynym powodem używam print() podczas pętli jest pokazanie postępów, EG, od przeczytaniu wielu plików.

for (i in 1:10) { 
    print(i) 
    flush.console() 
    for(j in 1:100000) 
    k <- 0 
} 
+0

Głosowanie za odpowiedzią na pytanie zawarte w tytule. To powinno być zredagowane, dlatego tytuł tego pytania nie pasuje do samego pytania. – aldux

+0

Up głosowanie na flush.console() – szeta

4

Fantastyczna odpowiedź od Gavin Simpson. wziąłem ostatni kawałek magii i przekształcił go w funkcji.

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) 
} 

Następnie można po prostu zadzwonić go z ramki danych sw.df (dF)

a jeśli chcesz spróbować transformacji: sw.df (log (df))