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

Fra*_*ank 9 perl grep functional-programming r map

我对(功能)矢量操作感兴趣R.具体来说,什么是R的等同Perl的mapgrep

以下Perl脚本使用偶数数组元素并将它们乘以2:

@a1=(1..8); 
@a2 = map {$_ * 2} grep {$_ % 2 == 0} @a1;
print join(" ", @a2)
# 4 8 12 16
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做R?我得到了这个,sapply用于Perl map:

> a1 <- c(1:8)
> sapply(a1, function(x){x * 2})
[1]  2  4  6  8 10 12 14 16
Run Code Online (Sandbox Code Playgroud)

我在哪里可以阅读更多关于这种功能阵列操作的内容R

此外,有没有一个PerlR语法书,类似于Perl的Python的短语

Dir*_*tel 10

快速的:

  • 此外sapply,也有lapply(),tapply,by,aggregate多在基地.然后在CRAN上有大量的附加软件包,例如plyr.

  • 对于基本功能的编程在其他语言: Reduce(),Map(),Filter(),...所有这些都是同一个帮助页面上; 试着help(Reduce)开始吧.

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

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

  • 你似乎错过了R中的一些东西.我建议最近出版一本关于R和S语言的书.我的建议是Chambers(2008)"数据分析软件"


ama*_*ion 7

R有"grep",但它与你习惯的完全不同.R内置了更好的东西:它能够使用布尔表达式创建数组切片:

a1 <- c(1:8)
a2 <- a1 [a1 %% 2 == 0]
a2
[1] 2 4 6 8
Run Code Online (Sandbox Code Playgroud)

对于map,你可以像上面那样应用一个函数,但只需编写就可以了:

a2 * 2
[1]  4  8 12 16
Run Code Online (Sandbox Code Playgroud)

或者一步到位:

a1[a1 %% 2 == 0] * 2
[1]  4  8 12 16
Run Code Online (Sandbox Code Playgroud)

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