当我运行此代码时:
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
最后一部分来自哪里,如何摆脱它?
答案 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