Нахождение всех положений для нескольких элементов в векторе

Вы можете сжать тело сообщения - , однако - тела сообщения 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, который имеет тот же набор символов и ограничения размера).

21
задан Jaap 17 August 2018 в 08:01
поделиться

5 ответов

Это один из способов сделать это. Сначала я получаю индексы, при которых х равен 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
38
ответ дан 29 November 2019 в 20:06
поделиться

Вы можете попробовать оператор | для коротких условий

which(x == 8 | x == 9)
9
ответ дан 29 November 2019 в 20:06
поделиться

В в этом конкретном случае вы также можете использовать 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 не обнаружен.

2
ответ дан 29 November 2019 в 20:06
поделиться

В качестве альтернативы, если вам не нужно использовать индексы, а только элементы, которые вы можете сделать

> 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
1
ответ дан 29 November 2019 в 20:06
поделиться

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)
-1
ответ дан 29 November 2019 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: