16

我经常想做如下的事情:

sapply(sapply(x, unique),sum)

我也可以这样写:

sapply(x, function(y) sum(unique(y)))

但我不喜欢每次都写出 lambda。那么是否有某种功能可以让我编写?

sapply(x, concat(sum,unique))

并且concat只是连接这两个函数,从而创建一个新的函数,它一个接一个地执行。

4

4 回答 4

14

为此,您可以使用包中的函数,该Compose函数在functionalCRAN 上可用。:

library(functional)
sapply(x, Compose(unique,sum))
于 2013-05-01T11:45:37.083 回答
5

使用magrittr

如果我们require(magrittr),那么我们可以

sapply(x, . %>% unique %>% sum)

甚至

x %>% sapply(. %>% unique %>% sum)

甚至更

x %>% sapply(unique) %>% sapply(sum)

文档中引用:

  • x %>% f相当于f(x)
  • x %>% f(y)相当于f(x, y)
  • x %>% f %>% g %>% h相当于h(g(f(x)))
于 2015-09-01T10:23:51.040 回答
4

更多关于柯里化和作曲的信息

partial封装内的实现与封装pryr内大致相同,但方式不同。Curryfunctional

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,pryrdostats:compose%.%-- 都有相同名称(但不同)的版本,并且两者都不同于functional:::Compose.

最后,我要补充一点,pryr包括f哪些可以方便地使用而不是function匿名函数。

于 2014-01-09T12:50:09.170 回答
-2

你可以自己种植:

myfunc <- function(y) {
    yu <- unique(y)
    ys <- sum(yu)
    return(ys)
    }

然后

sapply(x, myfunc)
于 2013-05-01T11:34:31.413 回答