gpt4 book ai didi

r - 为什么 R 对象不在函数或 "for"循环中打印?

转载 作者:行者123 更新时间:2023-12-02 15:03:40 24 4
gpt4 key购买 nike

我有一个名为 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

例如,或者使用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

这一定比将输出发送到屏幕然后你必须通过它更好吗?

关于r - 为什么 R 对象不在函数或 "for"循环中打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4716152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com