什么是R的等价于Perl的地图和grep?

时间:2010-08-02 13:43:01

标签: perl r functional-programming map grep

我对R中的(功能)矢量操作感兴趣。具体来说,R与Perl mapgrep的等价物是什么?

以下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中有关此类功能数组操作的更多信息?

此外,是否有PerlR短语手册,类似于Perl Python Phrasebook

2 个答案:

答案 0 :(得分:10)

快速的:

  • sapply外,基地还有lapply()tapplybyaggregate等。然后CRAN上有大量的附加包,例如plyr

  • 对于基本函数式编程,与其他语言一样:Reduce()Map()Filter(),...所有这些都在同一个帮助页面上;尝试help(Reduce)开始使用。

  • 如前面的回答所述,矢量化在这里更合适。

  • 至于grep,R实际上有三个内置的regexp引擎,包括libpcre的基于Perl的版本。

  • 你似乎错过了R中的一些东西。我建议最近出版一本关于R和S语言的书。我的建议是钱伯斯(2008)"Software for Data Analysis"

答案 1 :(得分:7)

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

或者一步到位:

a1[a1 %% 2 == 0] * 2
[1]  4  8 12 16

我从未听说过Perl to R短语书,如果你找到一个让我知道的话!一般来说,R的文档比perl或python少,因为它是一种小众语言。