而不是将一个向量下标操作写成一行,例如:
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
答案 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
所做的事情),但是您将以这种方式创建相当多的复杂代码。