2

而不是写一个向量下标操作一行,例如:

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 回答