我有一个列表,基本上是不同变量的表,下面是一个可重复的虚拟示例(它有点难看,但它能传达思想)。
results <- list()
for(ii in names(iris)[1:4]) {
mytab <- table(iris[,i] > mean(iris[,i]), iris$Species)
myp <- chisq.test(mytab)$p.value
results[[ii]] <- as.data.frame(cbind(mytab, P.value=myp))
results[[ii]] <- tibble::rownames_to_column(results[[ii]], ii)
}
在以前的R版本(至少4.0)中,我曾经能够做这样的事情:
lapply(results, function(x) write.table(x, "myfile.txt", append=T, sep="t", quote=F, row.names=F))
将生成一个名为myfile.txt
的文件,并在其中填充我的所有表,就像从结果中打印的表列表一样。至少从2021年底开始,我就有了这个代码(按预期运行)。但是,我现在得到错误:
Error in write.table(x, "myfile.txt", append = T, sep = "t", quote = T, :
(converted from warning) appending column names to file
在某种程度上,我明白了——我使用的列名与我附加的列名不相同,但我并不真正关心我的目的。我只想要打印出来的表格。是否有一种方法可以强制附加不匹配的列名?我曾尝试使用col.names=NA
,但随后收到使用col.names=NA与row.names=F"没有意义"的错误。我是否需要放弃使用sink
这样的函数?如果可能的话,我真的希望所有的东西都保持tab分隔。
它似乎是内置的,完全取决于col.names
和append
参数,并且没有简单的方法来压制它那里。
一般来说,这只是一个警告,但由于它被提升到Error
状态,这表明您已经设置了options(warn = 2)
或更高。它不是这些分辨率的一个因素(这导致不会发出警告,因此不会升级为错误)。
-
抑制它和所有其他警告(无论是好是坏):
write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F) # Error in write.table(data.frame(a = 1, b = 2), "quux.csv", append = T, : # (converted from warning) appending column names to file suppressWarnings(write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F)) ### nothing emitted, file appended
-
只抑制警告,允许其他(因为抑制所有可以隐藏其他问题):
withCallingHandlers( write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F), warning = function(w) { if (grepl("appending column names to file", conditionMessage(w))) { invokeRestart("muffleWarning") } }) ### nothing emitted, file appended withCallingHandlers( write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F), warning = function(w) { if (grepl("something else", conditionMessage(w))) { invokeRestart("muffleWarning") } }) # Error in write.table(data.frame(a = 1, b = 2), "quux.csv", append = T, : # (converted from warning) appending column names to file
另一个可能的解决方案是使用erer包中的write.list()
:
library(erer)
#> Loading required package: lmtest
#> Loading required package: zoo
#>
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#>
#> as.Date, as.Date.numeric
#> Registered S3 method overwritten by 'quantmod':
#> method from
#> as.zoo.data.frame zoo
results <- list()
for(ii in names(iris)[1:4]) {
mytab <- table(iris[,ii] > mean(iris[,ii]), iris$Species)
myp <- chisq.test(mytab)$p.value
results[[ii]] <- as.data.frame(cbind(mytab, P.value=myp))
results[[ii]] <- tibble::rownames_to_column(results[[ii]], ii)
}
write.list(z = results, file = "myfile.txt", row.names = FALSE, quote = FALSE)
read.csv("~/Desktop/myfile.txt")
#> Result Sepal.Length setosa versicolor virginica P.value
#> 1 Sepal.Length FALSE 50 24 6 8.373761e-18
#> 2 Sepal.Length TRUE 0 26 44 8.373761e-18
#> 3
#> 4 Result Sepal.Width setosa versicolor virginica P.value
#> 5 Sepal.Width FALSE 8 42 33 1.24116e-11
#> 6 Sepal.Width TRUE 42 8 17 1.24116e-11
#> 7
#> 8 Result Petal.Length setosa versicolor virginica P.value
#> 9 Petal.Length FALSE 50 7 0 9.471374e-28
#> 10 Petal.Length TRUE 0 43 50 9.471374e-28
#> 11
#> 12 Result Petal.Width setosa versicolor virginica P.value
#> 13 Petal.Width FALSE 50 10 0 4.636126e-26
#> 14 Petal.Width TRUE 0 40 50 4.636126e-26
#> 15
# You can also specify the table names, e.g.
write.list(z = results, file = "myfile2.txt", row.names = FALSE, quote = FALSE, t.name = 1:4)
read.csv("~/Desktop/myfile2.txt")
#> Result Sepal.Length setosa versicolor virginica P.value
#> 1 1 FALSE 50 24 6 8.373761e-18
#> 2 1 TRUE 0 26 44 8.373761e-18
#> 3
#> 4 Result Sepal.Width setosa versicolor virginica P.value
#> 5 2 FALSE 8 42 33 1.24116e-11
#> 6 2 TRUE 42 8 17 1.24116e-11
#> 7
#> 8 Result Petal.Length setosa versicolor virginica P.value
#> 9 3 FALSE 50 7 0 9.471374e-28
#> 10 3 TRUE 0 43 50 9.471374e-28
#> 11
#> 12 Result Petal.Width setosa versicolor virginica P.value
#> 13 4 FALSE 50 10 0 4.636126e-26
#> 14 4 TRUE 0 40 50 4.636126e-26
#> 15
由reprex包(v2.0.1)创建于2022-07-19