【问题标题】:R. How to use T and F instead of TRUE and FALSER. 如何使用 T 和 F 代替 TRUE 和 FALSE
【发布时间】:2017-01-06 00:08:36
【问题描述】:

R 用户在写逻辑值时可以使用 T 和 F 代替 TRUE 和 FALSE,但 R 输出始终是长版本,TRUE 和 FALSE。

有没有办法强制 R 使用 T 和 F?
我的意思是在所有输出中使用它,包括将对象保存到文件时?

它更整洁,在屏幕和文件中占用的空间更少。

我知道我可以将所有 TRUE 替换为“T”,并将所有 FALSE 替换为“F”,但这并不好,因为它不再被识别为逻辑,而是文本。

我认为 cran 包装中不允许使用 T 和 F,但这是另一回事。

【问题讨论】:

  • 您应该始终使用 TRUE 和 FALSE
  • @skan - 这是一个夸张的例子,但你也可以很容易地做到T <- 0,然后突然之间会切换一堆逻辑比较。为了节省一些代码字符,这不是一个“好主意”(tm)。
  • 您必须为每个用例制定一个特殊的方法。一个好的开始是为print.logical 编写一个自定义方法。我不知道要修改什么,比如 write.csv 对于这种(可怕的想法)行为,但查看 write.table 代码,您似乎需要在 C 中进行一些修改并重新编译。
  • 有些人指出要避免使用TF 而不是TRUEFALSE。该建议适用于代码,但可能适合输出,也可能不够!

标签: r logical-operators


【解决方案1】:

要在屏幕上打印,您可以这样做:

x <- c(TRUE, FALSE)
class(x)
#[1] "logical"

print.logical <- function(x, ...) {
  print.default(c("F", "T")[x + 1L], quote = FALSE, ...)
}

format.logical <- function(x, ...) {
  format.default(c("F", "T")[x + 1L], ...)
}


print(x)
#[1] T F
x
#[1]  TRUE FALSE
format(x)
#[1] "T" "F"

DF <- data.frame(a = 1:2, b = c(FALSE, TRUE))
DF
#  a b
#1 1 F
#2 2 T

如您所见,隐式打印不会为非对象执行方法分派(主要原因是性能),如果不更改 C 代码并重新编译 R,我们将无能为力。您可以创建您自己的 S3 类,但这不是很方便。

对于文件导出,您可以使用更改为字符向量的类似策略,但您需要实际更改它并且不能使用printformat 方法。我会明确地这样做,而不是通过 S3 方法。

【讨论】:

    【解决方案2】:

    您似乎对 TRUEFALSE 的存储方式感到困惑:

    > x <- sample(c(TRUE, FALSE), 100, replace = TRUE)
    
    > object.size(x)
    440 bytes
    
    > y <- sample(c(0L, 1L), 100, replace = TRUE)
    
    > object.size(y)
    440 bytes
    

    逻辑值存储为0L(“逻辑零”)和1L(“逻辑一”)。

    存储独立于屏幕上对象的“外观”:

    > object.size(0L)
    48 bytes
    > object.size(0)
    48 bytes
    > object.size(F)
    48 bytes
    > object.size(FALSE)
    48 bytes
    

    ...这意味着您不会丢失磁盘空间。

    您会丢失磁盘空间的唯一情况是将 TRUE/FALSE 保存为 CSV 文件中的文本,例如,在这种情况下,请将其另存为 0/1

    【讨论】:

    • 我不是指内存中的对象大小,而是在屏幕上打印和保存在 csv 文件中时的字符大小。如果您有一个包含 30 列的 data.frame,如果您使用 TRUE 或 FALSE 等长名称,您将无法正确查看它。
    • 如果您的“文件”都是 CSV,只需使用 as.integer 重新编码为 0/1。对于屏幕视图,答案取决于您用于在屏幕上“打印”对象的方法。
    • 投反对票的不是我。我从不对试图提供帮助的人投反对票
    • 不用担心 :) 我希望投反对票的人解释原因,但如果她/他决定不这样做,那就太公平了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多