我经常想做如下的事情:
sapply(sapply(x, unique),sum)
我也可以这样写:
sapply(x, function(y) sum(unique(y)))
但我不喜欢每次都写出 lambda。那么是否有某种功能可以让我编写?
sapply(x, concat(sum,unique))
并且concat
只是连接这两个函数,从而创建一个新的函数,它一个接一个地执行。
我经常想做如下的事情:
sapply(sapply(x, unique),sum)
我也可以这样写:
sapply(x, function(y) sum(unique(y)))
但我不喜欢每次都写出 lambda。那么是否有某种功能可以让我编写?
sapply(x, concat(sum,unique))
并且concat
只是连接这两个函数,从而创建一个新的函数,它一个接一个地执行。
为此,您可以使用包中的函数,该Compose
函数在functional
CRAN 上可用。:
library(functional)
sapply(x, Compose(unique,sum))
partial
封装内的实现与封装pryr
内大致相同,但方式不同。Curry
functional
(Curry
创建一个参数列表并将其提供给do.call
.partial
从字面上创建一个新函数,该函数调用具有默认参数集的第一个函数。)
在R-devel 的这个讨论中,Luke Tierney 指出了一些问题Curry
(“这在评估/惰性评估方面与类似的匿名函数有完全不同的行为。此外,do.call 有一些相当奇怪的方面,所以它尊重关于它如何与 sys.xyz 函数交互,并且在许多情况下我关心的不是你想要的,当引号 = FALSE 时,这是默认设置。添加它会产生比解决的问题更多的问题。" )。这些问题(尽管它们可能很少出现)与partial
.
柯里化/部分函数应用的其他方法:
wargs
在包装中dostats
(类似于partial
但有一些独特之处:
wargs(mean, na.rm=TRUE)(c(1:5, NA), na.rm=FALSE)
# this works and gives NA as answer, so na.rm=FALSE overrides na.rm=TRUE
# with partial, this would result in an error:
#### formal argument "na.rm" matched by multiple actual arguments
%but%
包中有,operators
但不适用于通用函数。所以 ...
df <- data.frame(a=c(1:5,NA), b=c(NA, 2:6))
sapply(df, mean %but% list(na.rm=TRUE))
# a b
# NA NA
# ... but2
sapply(df, sd %but% list(na.rm=TRUE))
# a b
# 1.581139 1.581139
它有一个单独的机制来设置逻辑参数:
# from the help page
grep %but% "pf" # grep, with perl and fixed set to TRUE
至于 compose,pryr
和dostats
:compose
和%.%
-- 都有相同名称(但不同)的版本,并且两者都不同于functional:::Compose
.
最后,我要补充一点,pryr
包括f
哪些可以方便地使用而不是function
匿名函数。
你可以自己种植:
myfunc <- function(y) {
yu <- unique(y)
ys <- sum(yu)
return(ys)
}
然后
sapply(x, myfunc)