为什么函数不显示应显示的内容?

时间:2018-11-14 21:03:05

标签: r display

我在R中有以下代码,但是输出中有问题,它应该显示不同的内容。这就是显示

Summary(x, y)

The total square sum is: 17.5The error square sum is: 0 
[[1]]
NULL

[[2]]
[1] "\n"

[[3]]
NULL

应该显示

The total square sum is: number1

The error square sum is: number2

您能检查一下吗?

(这是一个示例,实际上我必须显示更多的东西the standar error is: number3, the variance is number4, etc..

Summary <- function(x, y, print=TRUE) {
      p <- 2
      n <- length(x)

      x <- matrix(c(rep(1,n),x),n,p)
      bg <- solve(t(x)%*%x,t(x)%*%y)
      invx <- solve(t(x)%*%x)
      xty <- t(x)%*%y
      e <- y-x%*%bg
      SCT <- sum(y^2)-n*(mean(y)^2)
      SCE <- sum(e*e)

      result <- list(
        cat("The total square sum is:", SCT), 
        "\n", 
        cat("The error square sum is:", SCE, "\n"))
      return(result)      
}

x <- y <- 1:6
Summary(x, y)

1 个答案:

答案 0 :(得分:1)

list()从对象创建列表,但是cat()不返回对象,它只是打印到控制台。这就是为什么两个列表元素说NULL(它们为空,而其中一个包含字符串"\n"(实际对象)的原因。

以更复杂的格式打印文本可能很困难且不直观,但是我发现在现有的R代码中可以找到很多启发和帮助。

print.lm()为例,该函数负责显示使用lm()的线性回归的结果。

运行stats:::print.lm,您将看到:

function (x, digits = max(3L, getOption("digits") - 3L), ...) 
{
    cat("\nCall:\n", paste(deparse(x$call), sep = "\n", collapse = "\n"), 
        "\n\n", sep = "")
    if (length(coef(x))) {
        cat("Coefficients:\n")
        print.default(format(coef(x), digits = digits), print.gap = 2L, 
            quote = FALSE)
    }
    else cat("No coefficients\n")
    cat("\n")
    invisible(x)
}

看起来有点忙,但是还算不错。您会看到,每次对cat()的调用都包含一个或多个按顺序排列的字符串和定界符(例如\n\t用于换行和制表),其中{{1} },分隔符,在末尾指定。有时,sep内会有一个paste()调用,在这种情况下,cat()只是为“ paste()”打印准备一些字符。我们还注意到,有多个对cat()cat()的调用,并且混合和匹配已经完成,没有问题。最后,是MrFlick在评论中提到的print()的示例。该命令确保该函数不会输出其参数(在本例中为invisible()),但是您仍然可以将其分配给变量。

有了这些见解,我们是否可以改善x

Summary()

看起来有点复杂。让我们测试一下。

Summary  <-  function(x, y, print=TRUE) {
    p  <-  2
    n <- length(x)

    xm <- matrix(c(rep(1,n),x),n,p)
    bg <- solve(t(xm)%*%xm,t(xm)%*%y)
    invx <- solve(t(xm)%*%xm)
    xty <- t(xm)%*%y
    e <- y-xm%*%bg
    SCT <- sum(y^2)-n*(mean(y)^2)
    SCE <- sum(e*e)

    results <- list(TSS=SCT, ESS=SCE, p=p, x=x, y=y)

    if (SCE == 0) warning("Error square sum is zero", call.=FALSE)

    if (print) {
        cat("Results for the variables", "\n\t",
            deparse(match.call()$x), " and ", deparse(match.call()$y),
            "\n\n", sep="")
        cat("The total square sum is: ", SCT, "\n\n",
            "The error square sum is: ", SCE, "\n\n", sep="")
        invisible(results)
    } else {
        results
    }      
}