#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()
упомянутая вами функция, которая может это сделать. Я добавляю второй пример.