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

cat() returning undesired list when using 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

最后一部分是从哪里来的,我该如何去掉它?

您可以用 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

lapply(因此,sapply)有一个 return 值,该值由函数调用的 return 值构成(NULL示例)在循环中。如果您不想要 return 值并且只想要打印或绘图等副作用,您应该使用 for 循环。

实际上,您不需要循环(*apply 或 for)即可:

> 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