以下函數用於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 reference
或call by value
。
以下函數用於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 reference
或call by value
。
要通過恆定Ÿ乘以一個向量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
如果你正在尋找一種簡單的方式通過一個常數相乘的序列,肯定使用@費爾南多的答案或者類似的東西。我假設你只是想確定參數在這段代碼中傳遞的方式。
lapply
使用第一個參數1, 2, ..., x
的每個值調用其第二個參數(在您的案例中爲function(a, b) b*a
)。這些值將作爲第一個參數的第二個參數傳遞(所以,你的情況,他們會爭論a
)。
任何其他參數lapply
前兩個,在你的情況b=y
,通過名稱傳遞給函數。所以,如果你叫你的內部函數fxn
,那麼你的lapply
調用發出的呼叫像fxn(1, b=4), fxn(2, b=4), ...
。參數按值傳遞。
你應該閱讀的lapply
幫助理解它是如何工作的。閱讀這本優秀的answer以獲得和不同的xxpply家庭功能的一個很好的解釋。
從laapply
幫助:
lapply(X, FUN, ...)
這裏FUN被應用到每個elementof X和...是指:
...可選參數樂趣。
由於FUN有一個可選的參數b,我們用替換爲b = y。
你可以把它看作是一個語法糖,並強調一個事實,即參數b爲可選的比較來論證一個。如果2個參數是對稱的,那麼最好使用mapply
。
簡短的回答:R
是call by value
。長的答案:它可以做到這一點。
你要通讀:the R language definition瞭解更多詳情。
R
大多采用call by value
但是這是由它的延遲計算複雜:
所以,你可以有一個函數:
f <- function(x, y) {
x * 3
}
如果在兩個大矩陣傳遞給x
和y
,只有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)
另一種方法是使用bigmemory
bigmatrix
和包(見The bigmemory project)。這允許您在內存中創建矩陣(底層數據存儲在C中),並返回指向R
會話的指針。這允許你做一些有趣的事情,比如從多個R會話中訪問相同的矩陣。
要將序列x乘以一個常數y,只需做(1:x)* y ... like(1:3)* 2輸出2,4,6。 – Fernando