在R中匿名参考向量

时间:2012-10-02 21:25:27

标签: r

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

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

1 个答案:

答案 0 :(得分:4)

考虑intersect次来电match,你所做的事情是多余的。 intersect定义为:

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

使用%in%x[y%in%x],您可以获得与3行代码相同的结果。

我意识到这可能无法代表你的实际问题,但“匿名引用一个载体”并不适合R范式。函数参数是按值传递的。你基本上是在说,“我想要一个函数来操作一个对象,但我不想把这个对象提供给函数。”

您可以使用R的范围规则来执行此操作(这是mplourde使用带有匿名函数的Filter所做的事情),但是您将以这种方式创建相当多的复杂代码。