16

多くの場合、次のようなことをしたいと思います。

sapply(sapply(x, unique),sum)

次のように書くこともできます:

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

しかし、毎回ラムダを書き出すのは好きではありません。それで、私が書くことができるある種の関数はありますか?

sapply(x, concat(sum,unique))

2 つの関数を連結するだけで、concat新しい関数が作成され、次々に実行されます。

4

4 に答える 4

14

このために、CRAN で利用可能なパッケージCompose内の関数を使用できます。functional

library(functional)
sapply(x, Compose(unique,sum))
于 2013-05-01T11:45:37.083 に答える
4

カリー化と作曲の詳細

partialインパッケージpryrとほぼ同じですが、方法が異なるCurryインパッケージがあります。functional

(Curry は引数のリストを作成し、それを にフィードしdo.callます。partial文字通り、デフォルトの引数が設定された最初の関数を呼び出す新しい関数を作成します。)

R-devel のこの議論で Luke Tierney はいくつかの問題を指摘していますCurry( 「これは、評価/遅延評価に関して、類似の匿名関数とはまったく異なる動作をします。さらに、do.call にはかなり奇妙な側面があるため、それがsys.xyz関数とどのように相互作用するか、そして多くの場合、あなたが望むことをしません。デフォルトのように、quote = 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

pryr作成に関しては、とdostats:composeと-- の両方に同じ名前の (ただし異なる) バージョンがあり、%.%どちらも とは異なりfunctional:::Composeます。

最後に、匿名関数の代わりに便利に使用できるものがpryr含まれていることを追加します。ffunction

于 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 に答える