2017-01-06 3 views
1

Пользователи R могут использовать T и F вместо TRUE и FALSE, когда они хотят писать логические значения, но вывод R всегда является длинной версией, TRUE и FALSE.R. Как использовать T и F вместо TRUE и FALSE

Есть ли способ заставить R использовать T и F вместо этого?
Я имею в виду использовать его во всех выходах, в том числе при сохранении объекта в файле?

Это намного более аккуратный и занимает меньше места на экране и в файлах.

Я знаю, что я мог бы заменить все ИСТИНЫ для «Т», и все ЛОЖЬ для «F», но это было бы не очень хорошо, потому что это больше не будет признано логичным, вместо этого это будет текст.

Я думаю, что T и F не разрешены в пакетах cran, но это уже другая история.

+4

Вы всегда должны использовать TRUE и FALSE – HubertL

+0

Почему я должен HubertL? – skan

+0

Попробуйте 'T <- FALSE', затем попробуйте' TRUE <- FALSE' - разрешено только одно из них. – thelatemail

ответ

2

Вы, кажется, путают о том, как TRUE и FALSE сохраняются:

> 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.

+0

Я не имел в виду размер объекта в памяти, но размер символов при печати на экране и при сохранении в файле csv. Если у вас есть data.frame с 30 столбцами, вы не сможете просмотреть его правильно, если используете длинные имена, такие как TRUE или FALSE. – skan

+1

Если ваши «файлы» - это все CSV, просто перекодируйте в '0/1' с' as.integer'. Для просмотра экрана ответ зависит от метода, который вы используете для «печати» ваших объектов на экране. –

+0

Это был не я, который вас ниспровергал. Я никогда не сжимаю кого-то, кто пытается помочь – skan

6

Для печати на экране вы можете сделать следующее:

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, но это было бы не очень удобно.

Для экспорта файлов вы можете использовать аналогичную стратегию перехода к символьному вектору, но вам нужно будет фактически изменить его и не использовать метод print или format. Я бы сделал это явно, а не через S3-методы.

Смежные вопросы