2

1つのベクトル添え字演算を記述する代わりに、次のような行を記述します。

x.and.y <- intersect(x, y)
idx.x <- match(x, x.and.y)
idx.x <- idx.x[!is.na(idx.x)]

私はそれらを一行につなぐことができます:

x.and.y <- intersect(x, y)
idx.x <- subset(tmp <- match(x, x.and.y), !is.na(tmp))

そのためには、中間ベクトルに添え字操作で使用する名前を付ける必要があります。コードをさらに簡潔にするために、ベクトルを匿名で参照する方法はありますか?このような:

x.and.y <- intersect(x, y)
idx.x <- match(x, x.and.y)[!is.na] ## illegal R
4

1 に答える 1

4

intersect呼び出しを考慮するとmatch、あなたがしていることは冗長です。 intersectと定義されている:

function (x, y) 
{
    y <- as.vector(y)
    unique(y[match(as.vector(x), y, 0L)])
}

%in%また、 :を使用すると、3行のコードと同じ結果を得ることができますx[y%in%x]

これは実際の問題を表していない可能性があることは理解していますが、「ベクトルを匿名で参照する」ことは、Rパラダイムに実際には適合しません。関数の引数は値渡しです。基本的に、「関数でオブジェクトを操作したいのですが、関数にオブジェクトを提供したくない」と言っています。

Rのスコープルールを使用してこれを行うことができます(これは、mplourdeがFilter無名関数で使用したものです)が、その方法でかなり複雑なコードを作成することになります。

于 2012-10-02T22:34:04.957 に答える