2011-01-17 3 views
46

나는 ddd라는 R 매트릭스를 가지고있다. 샤피로 Wilk, 앤더슨 달링에R 객체가 함수 또는 "for"루프에서 인쇄되지 않는 이유는 무엇입니까?

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

통화는 모든 작업 줄기, 같은 열을 추출 :이 입력하면 모든 것이 잘 작동합니다.

이 코드를 "for"루프에 넣으면 Shapiro Wilk 및 Anderson Darling에 대한 호출이 작동을 멈추고 & 리프 호출과 인쇄 호출이 계속 작동합니다.

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 

기능을 시도하고 쓰면 똑같은 일이 발생합니다. SW & AD가 작동하지 않습니다. 다른 전화는 않습니다.

> 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 

모든 통화가 같은 방식으로 작동하지 않는 이유는 무엇입니까?

+0

'i'는 무엇입니까? - 첫 줄에'y <- 1'을 의미합니까? –

답변

50

루프 내에서 자동 인쇄 기능이 해제되어 있습니다. 출력을 보려면 두 경우 모두 명시 적으로 print해야합니다. [1] 9은 명시 적으로 y의 값을 인쇄하고 있기 때문에 표시됩니다.

다음은이 작업을 수행하는 방법에 대한 예입니다.

> 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 

자동 인쇄 기능이 있습니다.

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

더 많은 테스트를 인쇄 할 경우, 단지 루프에서 그들에게로 여분의 줄을 추가합니다 : 루프에서 우리는해야 할 것

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

을하지만 그것은 매우 아니다 당신이 출력의 양을 통해 독서를 좋아하지 않는 한 호소. 대신, 맞는 테스트 객체를 저장 한 다음 인쇄하고 조사하여 어쩌면 테스트 통계 및 p- 값을 테이블로 집계하여 처리 할 수 ​​있습니까? 우리는 다음 예를 들어

> obj[[1]] 

    Shapiro-Wilk normality test 

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

사용하거나 lapply를 사용하여 모델을 볼 수

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

개체를 설정을 담당 우리가를 저장하는 데 사용할 : 당신은 루프를 사용하여 그렇게 할 수 있습니다 우리에게 결과 :

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

    Shapiro-Wilk normality test 

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

말은 지금은 우리가 내선에 대한 모든 결과를 저장하는 객체를 처리 할 수 ​​있으며, Wp-value 데이터를 추출하고 싶었다 우리가 원하는 비트, 예를 RACT이가 가지고

> 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 

당신이 다음 부어해야 화면에 출력을 발사보다 더 될 :

> 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 

또는 유의 별의 경향을 가진 사람들을 위해

을 통하여?

+0

고마워요, 개빈. 나는 "인쇄"가 루프와 기능에서 꺼져 있다는 것을 몰랐다. 의사는 그렇게 말하지 않았다. 나는 또한 "y in seq_along (obj)"에 익숙하지 않았다. 네가 할 수 있다는 것을 몰랐어! 귀하의 답변은 매우 유용합니다. –

+0

나는 'printCoefmat'에 대해 몰랐다. 큰!! – Rodrigo

32

새로운 대답은 아니지만 위의 내용 외에도 "플러시.콘솔은() "루프 도중이 아니라 후보다 자리를 차지할 인쇄를 강제하는 것이 필요하다. 나는 루프 동안 인쇄()를 사용하는 유일한 이유 읽고 많은 파일들, 예를 들어 진행을 보여주는 것입니다.

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

제목에 언급 된 질문에 대한 답을 득표하십시오. 이것은이 질문의 제목이 질문 자체와 일치하지 않도록 편집되어야합니다. – aldux

+0

flush.console()에 대한 투표 결과가 없습니다. – szeta

4

환상적인 대답 개빈 심슨에서. 나는 마술의 마지막 비트를 데리고 함수로를 돌렸다.

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

그런 다음 당신은 당신의 데이터 프레임 sw.df (DF)

로 전화 그리고 당신이 원하는 경우에 수 변환 시도 : sw.df (log (df))