从这个问题开始,我从公式摘要中学到了如何替换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
答案 0 :(得分:1)
将输出捕获为out
,插入ABC
并执行替换给出的字符向量v
,将其折叠到给出s
的单个换行符分隔的字符串中。现在,根据您的需求,像问题中一样,将v
或s
分配给列表组件。 (如果分配了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.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格式时最后运行,但这取决于您执行此操作的过程。