如何将cat的输出分配给列表中的对象?

时间:2020-10-25 13:55:26

标签: r

从这个问题开始,我从公式摘要中学到了如何替换output

我想获取新的输出并将其分配给列表中的对象

这是我的代码

Unhandled exception:
DioError [DioErrorType.DEFAULT]: HttpException: Invalid response, unexpected 10 in reason phrase, uri = http://192.168.0.1/goform/getWifi
#0      DioMixin._dispatchRequest (package:dio/src/dio.dart:966:7)
<asynchronous suspension>
#1      DioMixin._request._interceptorWrapper.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:dio/src/dio.dart:849:37)
#2      DioMixin.checkIfNeedEnqueue (package:dio/src/dio.dart:1121:22)
#3      DioMixin._request._interceptorWrapper.<anonymous closure>.<anonymous closure> (package:dio/src/dio.dart:846:22)
#4      new Future.<anonymous closure> (dart:async/future.dart:175:37)
#5      Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
#6      _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397:19)
#7      _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
#8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

不幸的是,它没有保存到对象,而是继续打印

我知道我可以使用library(fpp) lst <- list() lst[["partone"]] <- cat( "ABC", gsub( "Pr(>F)", "p-value", capture.output(summary(aov(savings ~ single, data = credit))), fixed = T), sep = "\n") ,但我不想记住在处理输出时再次使用cat

3 个答案:

答案 0 :(得分:1)

将输出捕获为out,插入ABC并执行替换给出的字符向量v,将其折叠到给出s的单个换行符分隔的字符串中。现在,根据您的需求,像问题中一样,将vs分配给列表组件。 (如果分配了s,则可以省略创建v的行。)

out <-  capture.output(summary(aov(savings ~ single, data = credit)))
v <- c("ABC", sub("Pr(>F)", "p-value", out, fixed = TRUE), "\n") # char vec
s <- paste(v, collapse = "\n") # single string

cat(s)的结果是:

ABC
             Df Sum Sq Mean Sq F value p-value  
single        1     94   93.72   3.415 0.0652 .
Residuals   498  13668   27.45                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

具有打印方法的自定义类

我不确定增加的复杂性是否值得,但是如果您真的想创建一个显示良好的对象,则可以使用自定义打印方法创建一个新类:

print.selfcat <- cat
obj <- structure(s, class = "selfcat")
obj  # result is same as for cat(s)

summary.aov子类

另一种可能性是创建summary.aov类的子类summary.aov2,该子类添加一个name属性和一个print方法来将上面的所有内容包装在一起:

# convert summary.aov class to summary.aov2 class
as.summary.aov2 <- function(x, name = "", ...) {
  structure(x, name = name, class = c("summary.aov2", "summary.aov"))
}

print.summary.aov2 <- function(x, ...) {
  out <-  capture.output(structure(x, class = "summary.aov"))
  v <- c(attr(x, "name"), sub("Pr(>F)", "p-value", out, fixed = TRUE), "\n") 
  s <- paste(v, collapse = "\n")
  cat(s, ...)
}

# test
library(fpp)
modsum <- summary(aov(savings ~ single, data = credit))
modsum2 <- as.summary.aov2(modsum, name = "ABC") # create new object w name
modsum2

给予:

ABC
             Df Sum Sq Mean Sq F value p-value  
single        1     94   93.72   3.415 0.0652 .
Residuals   498  13668   27.45                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

答案 1 :(得分:0)

Cat通常将返回null,因此您的列表仍然是empty。也许这是解决问题的方法:

library(fpp)

lst <- list()

lst$"partone" <-list(    "ABC", gsub(
      "Pr(>F)",
      "p-value",
      capture.output(summary(aov(savings ~ single, data = credit))),
      fixed = T))
    
print("lst")
lst$"partone"

答案 2 :(得分:0)

由于您说过不想记住使用cat,因此可以创建修改后的summary.aov()函数,该函数首先打印出您想要的内容,然后您就可以省去{{ 1}}和cat

运行gsub,它将打印出一个函数定义(相当大的一个)。将其复制并粘贴到R文件中,然后将其分配给新名称,例如print(summary.aov),这比我在此处粘贴的功能要大,但是在其中可以找到字符串“ Pr(> F)”,然后可以将其替换为“ p-value”。

一种可能更干净的选择是搜索和替换脚本,该脚本在将报表构建为最终的PDF格式时最后运行,但这取决于您执行此操作的过程。