Преобразование большой строки в R в шестнадцатеричное значение

#r #boolean #hex

#r #логическое значение #шестнадцатеричное значение

Вопрос:

Мне нужно преобразовать большую строку из 1 м логических значений в шестнадцатеричное. Я не могу выбрать правильную библиотеку или синтаксис. Я думал, что смогу использовать gsub после преобразования логических значений в char, но я не могу сохранить его в необработанном типе данных. Каждое значение FALSE должно быть 0x0, а TRUE должно быть 0x8. Итак, это :

FALSEFALSEFALSETRUEFALSEFALSE

становится этими необработанными данными:

000800

Вот фрагмент кода, с которым я играл:

 sample<-paste0(sample(x=c(T,F),size=100,replace=T),collapse="")
best_raw<-as.vector(sample) %>%
    as.character(.) %>%
    paste(.,collapse="") %>%
    gsub(x=.,pattern="TRUETRUE",replacement=as.raw(0x88)) %>%
    gsub(x=.,pattern="FALSEFALSE",replacement=as.raw(0x00)) %>%
    gsub(x=.,pattern="TRUEFALSE",replacement=as.raw(0x80)) %>%
    gsub(x=.,pattern="FALSETRUE",replacement=as.raw(0x08))
  

но несколько вещей становятся очевидными … во-первых, я думал, что умело использую символы и as.raw, принимая два логических значения за раз, но gsub не учитывает входящие пары, поэтому я получаю массу таких вещей, как:

«8088TRUE00TRUE000000880800888088 TRUE»

Я видел несколько ссылок на bin2hex, но я не могу найти его в CRAN, и я не уверен, что он все равно будет делать то, что я хочу.

Комментарии:

1. Не могли бы вы пояснить, что такое входные и выходные данные? В вашем коде образец ввода имеет тип character, а не raw, это относится к фактическим данным? И я не думаю, что R имеет правильный шестнадцатеричный тип, поэтому вы хотите, чтобы выходные данные были целыми числами с 0 для FALSE и 8 для TRUE? Или вы хотите, чтобы это было как символьная строка?

2. Почему TRUE равно 0x8 ?

3. @Alexlok, мой ввод — это логический вектор. Я внес изменения в образец, изменив «TRUE» на T и «FALSE» на F.

4. @RuiBarradas, к сожалению, мой код вставляется в устаревший поток, и по какой-то причине F равно 0b0000, а T равно 0b1000 или 1000[2] . Я думаю, что это проще обозначить с помощью 0x0 и 0x8.

5. Мне все еще неясно, к какому типу данных относятся ваши входные и выходные данные. Что произойдет в устаревшем скрипте, если вы запустите typeof() ввод и вывод?

Ответ №1:

Если я правильно понимаю вопрос, у вас есть символьная строка с объединенными значениями TRUE и FALSE. Вы можете напрямую использовать gsub для замены их числами. Затем вы можете разделить отдельные числа, чтобы получить вектор, а не одну длинную строку, и вы можете применить необходимое преобразование к этому конечному вектору.

 smp <- paste0(sample(x=c("TRUE","FALSE"),size=100,replace=T),collapse="")
smp_as_numbers <- gsub("FALSE", "0",gsub("TRUE", "8", smp, fixed=TRUE), fixed = TRUE)
smp_as_vector <- strsplit(smp_as_numbers, "")[[1]]
as.raw(as.integer(smp_as_vector))

> as.raw(as.integer(smp_as_vector))
#  [1] 08 00 00 00 00 08 00 08 08 08 08 08 08 00 08 08 00 08 00 00 00 00 00 08 00 08 08 08
# [29] 08 00 00 08 00 00 00 08 00 00 08 08 00 00 00 00 08 08 08 08 08 08 00 08 00 08 08 00
# [57] 00 08 08 00 08 00 08 08 08 00 08 08 08 08 00 08 08 00 00 00 08 00 08 08 08 00 08 08
# [85] 08 00 08 00 00 08 08 00 00 08 08 00 00 08 00 00
> smp
#[1] #"TRUEFALSEFALSEFALSEFALSETRUEFALSETRUETRUETRUETRUETRUETRUEFALSETRUETRUEFALSETRUEFALSEFALSEFALSEFALSEFALSETRUEFALSETRUETRUETRUETRUEFALSEFALSETRUEFALSEFALSEFALSETRUEFALSEFALSETRUETRUEFALSEFALSEFALSEFALSETRUETRUETRUETRUETRUETRUEFALSETRUEFALSETRUETRUEFALSEFALSETRUETRUEFALSETRUEFALSETRUETRUETRUEFALSETRUETRUETRUETRUEFALSETRUETRUEFALSEFALSEFALSETRUEFALSETRUETRUETRUEFALSETRUETRUETRUEFALSETRUEFALSEFALSETRUETRUEFALSEFALSETRUETRUEFALSEFALSETRUEFALSEFALSE"
  

Если вы хотите использовать BMS::hex2bin() , вы должны использовать непосредственно неразрывные символы:

 smp <- paste0(sample(x=c("TRUE","FALSE"),size=5,replace=T),collapse="")
smp_as_numbers <- gsub("FALSE", "0",gsub("TRUE", "8", smp, fixed=TRUE), fixed = TRUE)
smp_as_numbers
# [1] "08888"
BMS::hex2bin(smp_as_numbers)
# [1] 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0

typeof(BMS::hex2bin(smp_as_numbers))
# [1] "double"
  

Комментарии:

1. Я думаю, вы очень хорошо понимаете. Последний шаг — это то, с чем я борюсь. Вместо возврата 8-битных значений (0x08 и 0x00) мне нужно вернуть 4-битные значения (0x0 и 0x8). Я не думаю, что as.raw это нравится…

2. В пакете BMS есть hex2bin() упомянутая вами функция, которая может это сделать. Я добавляю второй пример.