在一个循环中,自动打印被关闭,因为它在一个函数内部。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
现在说我想提取W
和p-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
这一定比向屏幕发射输出要好,然后你必须倾泻而出?