为什么R对象不能在函数或“for”中打印?循环? [英] Why do R objects not print in a function or a "for" loop?

查看:143
本文介绍了为什么R对象不能在函数或“for”中打印?循环?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为ddd的R矩阵。

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



$ b



$ b呼叫Shapiro Wilk,Anderson Darling,干所有的工作,如果我把这个代码放在一个for循环中,那么对Shapiro Wilk和Anderson Darling的调用将停止工作,而干扰& ($在7:10){
shapiro.test

  (ddd [,y])
ad.test(ddd [,y])
stem(ddd [,y])
print(y)
}

小数点在|的右边是1位数字

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)

小数点在|处

9 | 000
9 |
10 | 00000
$ b [1] 9

为什么所有的调用都不行在一个循环中,自动打印是关闭的,因为它是在一个函数内部的。如果你想查看输出结果,你需要在这两种情况下显式地 print >。 [1] 9 你得到的东西是因为你明确地打印了 y 的值。



下面是一个例子,你可能想要考虑这样做。

 > DF < -  data.frame(A = rnorm(100),B = rlnorm(100))
> y< - 1
> Shapiro-Wilk正态性检验

数据:DF [,y]
W = 0.9891,p值= 0.5895

所以我们有自动打印功能。在循环中,我们必须这样做:

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

如果您想要打印更多测试出来,然后在循环中添加它们作为额外的行:

$ p $ for(y in 1:2){$ b $ (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 < - vector (在seq_along(obj)){
obj [[y]] < - shapiro.test(DF [= 1])中的长度= 2)
## loop
。 ,y])
}

然后我们可以使用

 > obj [[1]] 

Shapiro-Wilk正态性检验

数据:DF [,y]
W = 0.9891,p值= 0.5895

举例来说,或是使用 lapply 设置我们用来存储结果的对象:

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

Shapiro-Wilk正态性检验

数据:X [[1L]]
W = 0.9891,p值= 0.5895

现在我想提取 W p-value 数据,我们可以处理存储所有结果的对象来提取我们想要的位,例如:

pre> > (< -t(sapply(obj2,function(x)c(x $ statistic,x $ p.value)))
> colnames(tab)< -c(W,p.value)
>标签
W p.value
A 0.9890621 5.894563e-01
B 0.4589731 1.754559e-17

或者对于喜欢明星的人来说:

 > (x),(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。代码:0'***'0.001'**'0.01'*'0.05'。'0.1''1

这个要比输出到屏幕要好,然后你必须倒入?

I have an R matrix named ddd. When I enter this, everything works fine:

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

The calls to Shapiro Wilk, Anderson Darling, and stem all work, and extract the same column.

If I put this code in a "for" loop, the calls to Shapiro Wilk, and Anderson Darling stop working, while the the stem & leaf call and the print call continue to work.

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

The same thing happens if I try and write a function. SW & AD do not work. The other calls do.

> 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

Why don't all the calls behave the same way?

解决方案

In a loop, automatic printing is turned off, as it is inside a function. You need to explicitly print something in both cases if you want to see the output. The [1] 9 things you are getting is because you are explicitly printing the values of y.

Here is an example of how you might want to consider going about doing this.

> 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

So we have automatic printing. In the loop we would have to do this:

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

If you want to print more tests out, then just add them as extra lines in the loop:

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

But that isn't very appealing unless you like reading through reams of output. Instead, why not save the fitted test objects and then you can print them and investigate them, maybe even process them to aggregate the test statistics and p-values into a table? You can do that using a loop:

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

We can then look at the models using

> obj[[1]]

    Shapiro-Wilk normality test

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

for example, or using lapply, which takes care of setting up the object we use to store the results for us:

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

    Shapiro-Wilk normality test

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

Say now I wanted to extract the W and p-value data, we can process the object storing all the results to extract the bits we want, e.g.:

> 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

Or for those with a penchant for significance stars:

> 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

This has got to be better than firing output to the screen that you then have to pour through?

这篇关于为什么R对象不能在函数或“for”中打印?循环?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆