2017-04-06 61 views
1

我們給出以下R代碼,它遍歷矩陣A的每一行和列,如果該值爲正值,則將其保存爲矩陣狀態,if它是負數,計算指數值-1。R - 將多行代碼轉換爲單行表達式

qFunc1 <- function(A) 
{ 
if (!is.matrix(A) || !is.numeric(A)) 
    stop("A must be numeric matrix") 

B <- matrix(NA, nrow=nrow(A), ncol=ncol(A)) 

for (i in seq_len(nrow(A))) 
{ 
    for (j in seq_len(ncol(A))) 
    { 
     if (!is.na(A[i, j])) 
     { 
      if (A[i, j] > 0) 
       B[i, j] <- A[i, j] 
      else 
       B[i, j] <- exp(A[i, j]) - 1 
     } 
    } 
} 

B 
} 

此代碼似乎給出正確的結果,但我們被要求給它作爲一個班輪,我似乎無法能夠實現一個行內的所有檢查。

所以問題是,如何在一行代碼中執行所有「if」檢查?

感謝您提前提供任何幫助!

+0

喜歡的東西,我認爲。 A < - 矩陣(rnorm(16),4,4)'。 '(應用(A,1,函數(x)ifelse(x> 0,x,exp(x)-1)))'。請記住在一行之下有代碼。所以你的職能是一個班輪。 :-)。 – DJJ

+0

這是偉大的,但不幸的是,我不允許使用任何類似於應用程序的功能......這是什麼給我的問題....:/ –

回答

3

This?

B <- A 
ind <- (A < 0) & !is.na(A) 
B[ind] <- exp(A[ind]) - 1 

如果你想要一個一行代碼

B <- ifelse((A < 0) & !is.na(A), exp(A) - 1, A) 
+0

是的!這似乎給出了完全相同的結果!這比我試圖編碼的複雜線條要容易得多!非常感謝你! –

+0

還有一件事,是否有一種方法可以將代碼寫入單行? –

+0

哦,是的,它還特別要求處理NA ...:/ –