2016-09-15 41 views
2

我是R的初學者。努力解決以下問題。在R中的矢量的平方根

創建一個新的R函數getRoot(),它將提供任何 數字的平方根。如果數字是負數,則返回'不可能'。 演示您的功能,使其產生以下輸出。

getRoot(C(4,-4,9,-16))= 2 '不可能' 3 '不可能'

我寫以下代碼:

"getRoot" <- function(x){ 
    res <- as.vector(x) 
    if(res < 0) { 
     cat("not Possible") 
    }else return(sqrt(res)) 
} 

getRoot(c(4,-4,9,-16)) 
[1] 2 NaN 3 NaN 

什麼可能的解決方案呢?謝謝。

+3

我覺得你的老師對你玩的很詭異。在R中,矢量不能是數字和字符類型的混合。或者......也許你需要一位新老師? –

+0

這對R函數來說是一個非常糟糕的要求。該函數的名字很可怕,R中已經存在的函數被忽略,並且它返回一個「字符」向量是非常可怕的。不要做這個運動。你不會學到任何東西。 – nicola

+1

將你的if-else改爲ifelse(res <0,「不可能」,sqrt(res))'會「起作用」 – rawr

回答

0

這是不可能的,返回一個向量c(4, 'not possible', 3, 'not possible')作爲這樣一個向量不存在。矢量中的所有元素必須是相同的類型。當然,您可以將數字輸出到一起。這是一個簡單的練習,可以通過多種方式解決。用於教學目的,我提出以下建議,其中兩個問題在一個非常實用的方式分爲兩種功能:

getSingleRoot <- function(x){ 
    if(x<0){ 
    cat("not possible ") 
    return(NaN) 
    } 
    else{ 
    cat(sqrt(x)) 
    cat(" ") 
    return(sqrt(x)) 
    } 
} 

getRoot <- Vectorize(getSingleRoot) 

a <- getRoot(c(4, -4, 9, -16)) 

其他好的解決方案可以利用一個for河套的Mapifelsesapplysqrt已經是矢量化函數等等。 Ìf這是作業,這取決於你已經學到了什麼。