0
我需要定義噸依賴於用戶輸入米即T = C(M,M,M),然後使用它的函數的重複元素的3D矢量:向量參數
b <- c(0.5,0.2,1)
fn <- function(m) { sum(t-b) }
是有一種方法可以告訴R t是一個具有元素m的三維重複向量嗎?
我需要定義噸依賴於用戶輸入米即T = C(M,M,M),然後使用它的函數的重複元素的3D矢量:向量參數
b <- c(0.5,0.2,1)
fn <- function(m) { sum(t-b) }
是有一種方法可以告訴R t是一個具有元素m的三維重複向量嗎?
使用rep()
功能,一個選項:
b <- c(0.5,0.2,1)
fn <- function(m, b) {
t <- rep(m , 3)
sum(t-b)
}
> fn(2, b)
[1] 4.3
你可以在這種情況下,依靠回收:
fn2 <- function(m, b) {
sum(m-b)
}
> fn2(2, b)
[1] 4.3
其中R自動地擴展m
是正確的長度。但這很危險,特別是如果你不檢查m
和b
的長度是否匹配。
使用rep()
將不會硬編碼長度t
需要的,但卻採取從b
,在一個更好的版本:
fn3 <- function(m, b) {
t <- rep(m , length(b))
sum(t - b)
}
> fn3(2, b)
[1] 4.3
> b <- c(b, b) ## make `b` longer
> length(b)
[1] 6
> fn3(2, b) ## fn3() still works
[1] 8.6
你fn()
的說明;你可以參考b
裏面的這個函數,但是不要通過b
作爲參數。因此,您依靠R在全球工作空間中找到合適的b
。這不是很好的做法。相反,像我在示例中那樣,通過參數傳遞函數內所需的所有對象。如果你這樣做,你會發現更容易追查的錯誤等。
謝謝。我知道這是一個非常基本的問題,但是當你在四條線上寫fn3時,有什麼好處?另外你會如何將它寫在一條線上? (當我嘗試單行時,我得到一個錯誤總和) –
我把它分開了,所以它更容易閱讀,因此更容易理解,因此更易於調試。就R而言,您需要在單獨一行中使用每條R語句。在'fn3()'中有2條語句,所以有兩條單獨的行。還有一種方法是,在一行中用';'分隔兩個語句,如下所示:'t < - rep(m,length(b)); sum(t - b)',但爲什麼你想這樣做是超出我的,特別是當你的代碼變得更復雜。 'function()'調用和右括號'{'不需要單獨放在單獨的行上,但我爲了便於閱讀而這樣做。 –