IT이야기

R 객체가 함수 또는 "for"루프에서 인쇄되지 않는 이유

cyworld 2021. 4. 2. 21:17
반응형

R 객체가 함수 또는 "for"루프에서 인쇄되지 않는 이유는 무엇입니까?


ddd라는 R 행렬이 있습니다. 이것을 입력하면 모든 것이 잘 작동합니다.

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

Shapiro Wilk, Anderson Darling 및 stem에 대한 호출은 모두 작동하며 동일한 열을 추출합니다.

이 코드를 "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

모든 호출이 동일한 방식으로 작동하지 않는 이유는 무엇입니까?


루프에서 자동 인쇄는 기능 내부에 있으므로 꺼집니다. 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- 값을 테이블로 집계하기 위해 처리 할 수도 있습니다. 루프를 사용하여 수행 할 수 있습니다.

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

그런 다음 사용하여 모델을 볼 수 있습니다.

> obj[[1]]

    Shapiro-Wilk normality test

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

예를 들어 또는 using lapply을 사용하여 결과를 저장하는 데 사용하는 객체를 설정합니다.

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

    Shapiro-Wilk normality test

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

이제 Wp-value데이터 를 추출하고 싶다고 가정 해 보겠습니다. 모든 결과를 저장하는 객체를 처리하여 원하는 비트를 추출 할 수 있습니다. 예 :

> 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

또는 중요 별을 좋아하는 사람들을 위해 :

> 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

화면에 출력하는 것보다 더 낫겠습니까?


새로운 답변은 아니지만 위의 내용에 추가하여 "flush.console ()"은 루프 이후가 아니라 루프 중에 강제로 인쇄를 수행하는 데 필요합니다. 루프 중에 print ()를 사용하는 유일한 이유는 많은 파일을 읽는 것과 같은 진행 상황을 표시하기 위해서입니다.

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

개빈 심슨의 환상적인 답변입니다. 나는 마지막 마법을 가지고 그것을 함수로 바꿨다.

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

참조 URL : https://stackoverflow.com/questions/4716152/why-do-r-objects-not-print-in-a-function-or-a-for-loop

반응형