2012-10-02 124 views
2

代替寫入一個矢量標操作的線,如:參考矢量匿名中的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 
+0

最接近你的是'Filter(function(...)!is.na(...),match(x,x.and.y))' –

+0

你最後一行代碼使用這個? idx.x < - which(match(x,x.and.y,nomatch = 0)!= 0) – tcash21

+1

如果這個例子是目標,而不只是一個方法來說明你正在接受的概念,我推薦'na.omit(match(x,x.and.y))' –

回答

4

考慮intersect電話match,你在做什麼是多餘的。 intersect被定義爲:

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

,你可以得到相同的結果,你的3行代碼使用%in%x[y%in%x]

我意識到這可能不代表您的實際問題,但「匿名引用向量」並不真正適合R範式。函數參數是按值傳遞的。你基本上說,「我想要一個函數來操作一個對象,但我不想爲該函數提供該對象。」

您可以使用R的範圍規則來執行此操作(這是mplourde使用Filter與匿名函數完成的操作),但是您將以這種方式創建相當複雜的代碼。

+0

「以匿名方式提到一個媒介」在R範例中非常重要。當你調用'lapply(X,fun)'時,'fun'被幾個不同的向量調用,但是這些調用都沒有引入代碼中可見的變量名。通常認爲使用lapply的好的R風格不會引入新的變量,而是引入新變量的for循環。基於價值的呼叫既不在這裏,也不在那裏。 – crowding

+0

@crowding:我不同意。在'lapply(X,fun)'中的幾個不同的向量上不會調用'fun';在列表中調用'fun',在代碼中可見變量名稱'X'。列表的元素綁定到值「X」。正如我在我的回答中所說的,您必須將對象傳遞給函數,或者依靠函數內的範圍來查找對象。如果我錯了,請用'lapply'回答OP的問題。 –

+0

'''x [y%%x]'''很整齊!謝謝,約書亞。瞭解關於成語R的更多內容是很好的。 – edwardw