Вы можете сжать тело сообщения - , однако - тела сообщения SNS поддерживают только символьные данные UTF-8. Сжатые данные являются двоичными, поэтому они не совместимы напрямую с SNS, поскольку не каждая возможная последовательность байтов также является допустимой последовательностью символов UTF-8.
Итак, после распаковки полезной нагрузки вам необходимо кодировать эти двоичные данные, используя схему типа base-64. Base-64 кодирует произвольные двоичные данные (8 бит на байт), используя только 64 (что составляет 2 ^ 6, что фактически дает 6 бит на байт) символы, поэтому в результате этого число байтов увеличивается на 8/6 (133%). кодирование. Это означает, что 192 КБ двоичных данных кодируется в 256 КБ данных в кодировке Base-64, поэтому максимально допустимый размер вашего сообщения после gzip становится 192 КБ (поскольку ограничение SNS составляет 256 КБ). Но все символы base-64 являются действительными однобайтовыми символами UTF-8, что является существенной причиной, почему это кодирование используется так часто, несмотря на увеличение его размера. Это и тот факт, что gzip обычно имеет степень сжатия, намного превосходящую 1,33: 1 (что является точкой безубыточности для gzip + base-64).
Но если ваши сообщения будут gzip до 192K или ниже, это определенно работает с SNS (а также SQS, который имеет тот же набор символов и ограничения размера).
Это один из способов сделать это. Сначала я получаю индексы, при которых х равен 8 или 9. Затем мы можем проверить, что при этих индексах х действительно 8 и 9.
> inds <- which(x %in% c(8,9))
> inds
[1] 1 3 4 12 15 19
> x[inds]
[1] 8 9 9 8 9 8
Вы можете попробовать оператор |
для коротких условий
which(x == 8 | x == 9)
В в этом конкретном случае вы также можете использовать grep
:
# option 1
grep('[89]',x)
# option 2
grep('8|9',x)
, которые оба дают:
[1] 1 3 4 12 15 19
Когда Вы также хотите определить число, состоящее из более чем одной цифры, второй вариант предпочтителен:
> grep('10|8',x)
[1] 1 12 18 19
Однако, я сделал акцент на этот конкретный случай в начало моего ответа по причине. Как отметил @DavidArenburg , это может привести к непредвиденным результатам. Использование, например, grep('1|8',x)
обнаружит 1
и 10
:
> grep('1|8',x)
[1] 1 10 12 18 19
Чтобы избежать этого побочного эффекта, вам придется заключить числа, которые будут обнаружены в ограничениях слов:
> grep('\\b1\\b|8',x)
[1] 1 10 12 19
Теперь 10
не обнаружен.
В качестве альтернативы, если вам не нужно использовать индексы, а только элементы, которые вы можете сделать
> x <- sample(1:10,20,replace=TRUE)
> x
[1] 6 4 7 2 9 3 3 5 4 7 2 1 4 9 1 6 10 4 3 10
> x[8<=x & x<=9]
[1] 9 9
grepl
может быть полезной функцией. Обратите внимание, что grepl
появляется в версиях R 2.9.0 и новее. Что удобно в grepl
, так это в том, что он возвращает логический вектор такой же длины, что и x
.
grepl(8, x)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
grepl(9, x)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[13] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
Чтобы получить ответ, вы можете сделать следующее
grepl(8,x) | grepl(9,x)