2013-01-09 33 views
0

我需要定義噸依賴於用戶輸入米即T = C(M,M,M),然後使用它的函數的重複元素的3D矢量:向量參數

b <- c(0.5,0.2,1) 
fn <- function(m) { sum(t-b) } 

是有一種方法可以告訴R t是一個具有元素m的三維重複向量嗎?

回答

1

使用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是正確的長度。但這很危險,特別是如果你不檢查mb的長度是否匹配。

使用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。這不是很好的做法。相反,像我在示例中那樣,通過參數傳遞函數內所需的所有對象。如果你這樣做,你會發現更容易追查的錯誤等。

+0

謝謝。我知道這是一個非常基本的問題,但是當你在四條線上寫fn3時,有什麼好處?另外你會如何將它寫在一條線上? (當我嘗試單行時,我得到一個錯誤總和) –

+0

我把它分開了,所以它更容易閱讀,因此更容易理解,因此更易於調試。就R而言,您需要在單獨一行中使用每條R語句。在'fn3()'中有2條語句,所以有兩條單獨的行。還有一種方法是,在一行中用';'分隔兩個語句,如下所示:'t < - rep(m,length(b)); sum(t - b)',但爲什麼你想這樣做是超出我的,特別是當你的代碼變得更復雜。 'function()'調用和右括號'{'不需要單獨放在單獨的行上,但我爲了便於閱讀而這樣做。 –