2014-01-08 49 views
3

以下函數用於y參數傳遞機制中的R

f1<-function(x,y){return (lapply(1:x, function(a,b) b*a, b=y))} 

貌似a用於表示該序列1:x中的元素相乘的序列1:x,但我不知道該怎麼理解這個參數傳遞機制。在其他面向對象的語言,如Java或C++,有call by referencecall by value

+1

要將序列x乘以一個常數y,只需做(1:x)* y ... like(1:3)* 2輸出2,4,6。 – Fernando

回答

2

要通過恆定Ÿ乘以一個向量x只是做

x * y 

(一些前綴)申請功能的工作原理非常相似對方,你想一個函數映射到您的向量的每個元素,列表,矩陣等:

x = 1:10 
x.squared = sapply(x, function(elem)elem * elem) 
print(x.squared) 
[1] 1 4 9 16 25 36 49 64 81 100 

它得到與矩陣和數據幀的更好,因爲你現在可以在所有行或列應用功能,並收集輸出。就像這樣:

m = matrix(1:9, ncol = 3) 
# The 1 below means apply over rows, 2 would mean apply over cols 
row.sums = apply(m, 1, function(some.row) sum(some.row)) 
print(row.sums) 
[1] 12 15 18 
1

如果你正在尋找一種簡單的方式通過一個常數相乘的序列,肯定使用@費爾南多的答案或者類似的東西。我假設你只是想確定參數在這段代碼中傳遞的方式。

lapply使用第一個參數1, 2, ..., x的每個值調用其第二個參數(在您的案例中爲function(a, b) b*a)。這些值將作爲第一個參數的第二個參數傳遞(所以,你的情況,他們會爭論a)。

任何其他參數lapply前兩個,在你的情況b=y,通過名稱傳遞給函數。所以,如果你叫你的內部函數fxn,那麼你的lapply調用發出的呼叫像fxn(1, b=4), fxn(2, b=4), ...。參數按值傳遞。

1

你應該閱讀的lapply幫助理解它是如何工作的。閱讀這本優秀的answer以獲得和不同的xxpply家庭功能的一個很好的解釋。

laapply幫助:

lapply(X, FUN, ...) 

這裏FUN被應用到每個elementof X和...是指:

...可選參數樂趣。

由於FUN有一個可選的參數b,我們用替換爲b = y。

你可以把它看作是一個語法糖,並強調一個事實,即參數b爲可選的比較來論證一個。如果2個參數是對稱的,那麼最好使用mapply

3

簡短的回答:Rcall by value。長的答案:它可以做到這一點。

呼叫按值,懶惰的評價,並劃定範圍

你要通讀:the R language definition瞭解更多詳情。

R大多采用call by value但是這是由它的延遲計算複雜:

所以,你可以有一個函數:

f <- function(x, y) { 
    x * 3 
} 

如果在兩個大矩陣傳遞給xy,只有x會被複制到f的被調用者環境中,因爲從不使用y

但你也可以訪問變量的f父環境:

y <- 5 
f <- function(x) { 
    x * y 
} 
f(3) # 15 

甚至:

y <- 5 
f <- function() { 
    x <- 3 
    g <- function() { 
    x * y 
    } 
} 
f() # returns function g() 
f()() # returns 15 

呼叫通過參考

有兩種方式R中做call by reference那我知道。

一種是通過使用Reference Classes,R的三個面向對象的範式中的一個(也參見:Advanced R programming: Object Oriented Field Guide

另一種方法是使用bigmemorybigmatrix和包(見The bigmemory project)。這允許您在內存中創建矩陣(底層數據存儲在C中),並返回指向R會話的指針。這允許你做一些有趣的事情,比如從多個R會話中訪問相同的矩陣。