【问题标题】:How to use apply, cat and print, without getting NULL如何使用 apply、cat 和 print,而不会得到 NULL
【发布时间】:2011-04-24 23:25:48
【问题描述】:

我正在尝试将cat() 用作apply() 中的函数。我可以几乎让 R 做我想做的事,但是在返回结束时我得到了一些非常令人困惑的(对我而言)NULLS。这是一个愚蠢的例子,强调我得到了什么。

val1 <- 1:10
val2 <- 25:34
values <- data.frame(val1, val2)
apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE))

这在 R 接受它并运行时“有效”,但我不明白结果。

> apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE))
1 25
2 26
3 27
4 28
5 29
6 30
7 31
8 32
9 33
10 34
NULL

但是,我想得到:

> apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE))
1 25
2 26
3 27
4 28
5 29
6 30
7 31
8 32
9 33
10 34

那么,如何删除最后的 NULL?

【问题讨论】:

  • 你看过 plyr 包中的 ddply 吗?
  • 没有。我从来没有掌握 plyr 的窍门。通常当我需要真正重塑数据时,我会将数据框粘贴到数据库中。并不是说 SQL 一定更好,但与 Postgres 相比,我通常比 R 更自在。
  • 但是,我应该花时间学习如何使用 plyr。下周我要休息一段时间来处理家庭事务。学习 plyr 会让我在晚上有事可做。

标签: r apply cat


【解决方案1】:

NULL 是 R 解释器打印您输入的表达式的值 - 应用。您可以将其分配到某处:

junk = apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE))

在这种情况下它不会被打印出来,或者将它包裹在“不可见”中:

invisible(apply(values, 1, function(x) cat(x[1], x[2], fill=TRUE)))

请注意,只有当您以交互方式运行此程序时,才会打印每一行,如果它在函数中,您将看不到它。

【讨论】:

  • invisible() 有效。我还发现 paste() 按我预期的方式工作。
  • 如果其他人和我一样密集,请注意:确保invisible() 用于整个apply() 函数,而不仅仅是cat()!我花了 15 分钟才意识到我做错了什么!
【解决方案2】:

您真的需要apply() 来循环浏览您的内容吗?

> print(values, row.names=FALSE)
 val1 val2
    1   25
    2   26
    3   27
    4   28
    5   29
    6   30
    7   31
    8   32
    9   33
   10   34

【讨论】:

  • 我的示例需要使用 apply 吗? - 不。这个例子只是一个简单的情况,突出了我遇到的问题。我实际上是从 data.frame 中的行中获取一堆数字,并为报告提供一些合理的东西。
  • 我担心你可能会误会事情。在apply() 中,您不使用cat(),而是使用切片、骰子、聚合和...返回一个值。你没有这样做,它在 NULL 显示的根目录下。
  • 我一直以为apply的使用就是在对象上使用函数而不使用循环。在这种情况下,我想通过连接一堆字符串来“聚合”。 paste() 似乎做了我认为 cat() 会做的事情。
【解决方案3】:

正如 Dirk 指出的那样,这不是在 R 中打印东西的方式。通常你会将结果分配给一个变量,然后打印它。没有副作用,可以这么说。

您的问题源于 cat 函数,它作为副作用打印到终端,但返回 NULL。

试试

a <- cat("blabla\n")  
a

如果你真的要使用apply进行打印,有两种解决方案。包裹在隐形电话中

invisible(apply(values, 1, function(x) invisible(cat(x[1], x[2], fill=TRUE))))

或者,只是将结果(NULL)分配给一个临时值

t <- apply(values, 1, function(x) invisible(cat(x[1], x[2], fill=TRUE)))

【讨论】:

  • 语言太多。时间太少了。 cat() 没有按我预期的方式工作。 paste() 可以。从技术上讲,我不想打印它们,我只想拿一堆东西并将它们连接成一个字符串。
  • 我最初的帖子不应该包含 print()。这对我来说是误导。我误解了 cat() 的使用,发现 paste() 似乎可以按我的意愿工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2014-04-15
  • 2021-12-24
  • 2011-05-02
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多