cat()在使用tapply时返回不需要的列表

时间:2015-01-15 10:54:07

标签: r cat tapply

当我运行此代码时:

a <- mtcars[,c("gear", "qsec")]
c <- tapply(a[,2], a[,1], length)
sapply(rownames(c), function(x) cat("Gear", x, "contains",  c[x], "qsec\n"))

我想得到这个:

Gear 3 contains 15 qsec
Gear 4 contains 12 qsec
Gear 5 contains 5 qsec

但我明白了:

Gear 3 contains 15 qsec
Gear 4 contains 12 qsec
Gear 5 contains 5 qsec
$`3`
NULL

$`4`
NULL

$`5`
NULL

最后一部分来自哪里,如何摆脱它?

3 个答案:

答案 0 :(得分:2)

您可以使用invisible对其进行换行,以便列表元素不会在R控制台中打印出来。

invisible(sapply(rownames(c), 
     function(x) cat("Gear", x, "contains",  c[x], "qsec\n")))
Gear 3 contains 15 qsec
Gear 4 contains 12 qsec
Gear 5 contains 5 qsec

答案 1 :(得分:2)

lapply(因此,sapply)具有一个返回值,该返回值是根据循环中函数调用(在您的示例中为NULL)的返回值构造的。如果您不想要返回值并且只想要打印或绘图等副作用,则应使用for循环。

答案 2 :(得分:2)

实际上,你不需要循环(既不适用也不适用):

> cat(paste("Gear", rownames(c), "contains", c, "qsec", collapse = "\n"))
Gear 3 contains 15 qsec
Gear 4 contains 12 qsec
Gear 5 contains 5 qsec