Я интересуюсь (функциональным) векторным управлением в R
. А именно, что R
эквиваленты Perl map
и grep
?
Следующий сценарий Perl захватывает ровные элементы массива и умножает их на 2:
@a1=(1..8);
@a2 = map {$_ * 2} grep {$_ % 2 == 0} @a1;
print join(" ", @a2)
# 4 8 12 16
Как я могу выполнить в этом R
? Я добрался настолько далеко, с помощью sapply
для Perl map
:
> a1 <- c(1:8)
> sapply(a1, function(x){x * 2})
[1] 2 4 6 8 10 12 14 16
Где я могу читать больше о таких манипуляциях функциональной матрицей в R
?
Кроме того, есть ли a Perl
кому: R
разговорник, подобный Perl Разговорник Python?
В R есть «grep», но он работает совершенно иначе, чем тот, к которому вы привыкли. R имеет что-то гораздо лучшее встроенное: у него есть возможность создавать срезы массива с помощью логического выражения:
a1 <- c(1:8)
a2 <- a1 [a1 %% 2 == 0]
a2
[1] 2 4 6 8
Для карты вы можете применить функцию, как вы делали выше, но гораздо проще просто написать:
a2 * 2
[1] 4 8 12 16
Или в one step:
a1[a1 %% 2 == 0] * 2
[1] 4 8 12 16
Я никогда не слышал о разговорниках Perl to R, если вы когда-нибудь найдете такой, дайте мне знать! В общем, у R меньше документации, чем у perl или python, потому что это такой нишевый язык.
Быстрые:
Кроме sapply
, есть еще lapply()
, tapply
, by
, aggregate
и многое другое в базе. Затем на CRAN есть множество дополнительных пакетов, таких как plyr.
Для базового функционального программирования, как и в других языках: Reduce()
, Map()
, Filter()
, ... все они находятся на одной странице помощи; попробуйте help(Reduce)
, чтобы начать.
Как отмечалось в предыдущем ответе, векторизация здесь даже более уместна.
Что касается grep
, то в R на самом деле встроено три механизма regexp, включая версию на основе Perl из libpcre.
Похоже, вам не хватает некоторых вещей в R, которые там есть. Я бы посоветовал хорошую недавнюю книгу по R и языку S; моя рекомендация - Chambers (2008) "Software for Data Analysis"