Когда Perl автоинициализирует переменные?

Вы можете выполнить этот анализ с помощью пакета stringr, однако я не думаю, что вам нужно использовать sapply.

Рассмотрим следующий список ключевых слов и таблицу с твитами:

keyword_list <- c("crimes against women", "downloading tweets", "r analysis")

tweets <- data.frame(
  tweet = c("Andhra Pradesh is the highest state with crimes against women",
            "I am downloading tweets",
            "I love r analysis",
            "downloading tweets helps with my r analysis")
)

Во-первых, вы хотите объединить ваши ключевые слова в одно регулярное выражение, которое ищет любую из строк.

keyword_pattern <- paste0(
  "(",
  paste0(keyword_list, collapse = "|"),
  ")"
)

keyword_pattern
#> [1] "(crimes against women|downloading tweets|r analysis)"

Наконец, мы можем добавить столбец к фрейму данных, который извлекает ключевое слово из твита.

tweets$keyword <- str_extract(tweets$tweet, keyword_pattern)

> tweets
#>                                                           tweet              keyword
#> 1 Andhra Pradesh is the highest state with crimes against women crimes against women
#> 2                                       I am downloading tweets   downloading tweets
#> 3                                             I love r analysis           r analysis
#> 4                   downloading tweets helps with my r analysis   downloading tweets

Как показывает последний пример, вам нужно подумать о том, что вы хотите делать, когда твит содержит несколько ключевых слов. В этом случае возвращаемое ключевое слово - просто первое найденное в твите. Однако вы также можете использовать str_extract_all для возврата ВСЕХ ключевых слов, найденных в твите.

8
задан Andrew 28 June 2012 в 21:07
поделиться

4 ответа

+ оператор оценивает и форму налево и форму направо от нее, затем возвращает сумму обоих. Оценка вызова хеша не видит специального контекста.

++ оператор имеет некоторое специальное встроенное волшебство. Заключение в кавычки из perlop страницы справочника, относительно ++ оператор:

"undef" всегда рассматривают как числовой, и в особенности изменяют на 0 прежде, чем увеличить (так, чтобы постинкремент значения undef возвратился 0, а не "undef").

править: Уточнить различие, ++ изменяет значение на месте, в то время как + просто берет его аргументы в качестве входа. Когда + видит неопределенное значение, обычно что-то пошло не так, как надо, но для ++, Ваш пример управления хешем очень типичен - пользователь хочет рассматривать undef как 0, вместо того, чтобы иметь необходимость проверить и инициализировать каждый раз. Таким образом, кажется, что имеет смысл рассматривать эти операторы этот путь.

15
ответ дан 5 December 2019 в 05:27
поделиться

It не, что Perl обязательно инициализирует значения, но что он не всегда предупреждает о них. Не пытайтесь думать о правиле для этого, потому что Вы будете всегда находить исключения, и как раз в то самое время, когда Вы думаете, что Вам выяснили его, следующая версия Perl изменит предупреждения на Вас.

В этом случае, как Harleqin заявил, автоинкрементные операторы имеют особый случай.

8
ответ дан 5 December 2019 в 05:27
поделиться

Определенные операторы сознательно опускают "неинициализированное" предупреждение для Вашего удобства, потому что они являются наиболее часто используемыми в ситуациях, где 0 или "" значение по умолчанию для левых или только операнда имеют смысл.

Это: ++ и - (или пред или сообщение), + =, - =. =, | =, ^ =, && =, || =.

Обратите внимание, что некоторые из них ошибочно дают предупреждение при использовании на связанной переменной: посмотрите, что тесты отметили TODO в http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t.

8
ответ дан 5 December 2019 в 05:27
поделиться

Поскольку Brian упомянул: это все еще делает это, это просто предупреждает Вас. Предупреждения говорят Вам об определенных манипуляциях с эффектами, что Вы, возможно, не предназначили.

Вы конкретно просите значение $histogram{$_}, добавление 1 к нему и затем присвоение его к тому же слоту. Это - тот же способ, которым я не ожидал бы, что autovivification будет работать здесь:

my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;

поскольку это делает здесь:

$hash_for{$key_level_1}{$key_level_2} = $value;

Волшебство, вероятно, не работает как оптимизация. И оптимизирующий компилятор заметил бы это a = a + 1 то же самое как a++ так, чтобы был там инкрементный оператор в ассемблере, он мог использовать, который оптимизировал инструкцию вместо того, чтобы притвориться, что он должен был сохранить первое значение и затем перезапись его, потому что он не на самом деле необходим.

Оптимизация является дополнительным исследованием и наверху однажды для улучшенной производительности каждое выполнение. Но нет никакой гарантии на динамическом языке, что Вы не добавляете наверху на том же уровне, Вы иначе попытались бы уменьшить его.

0
ответ дан 5 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

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