2016-09-15 9 views
2

私は下の質問を解決するRの苦闘の初心者です。ベクトルの平方根R

の平方根を提供する新しいR関数getRoot()を作成します。数字が負の場合は、「不可能」に戻ります。 次の出力を生成するように関数を示します。

getRoot(C(4、-4、9、-16))が '不可能3' 2 'ではない可能に' =

Iは、次のコードを書いた:

"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、not possible"、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)) 

他の良い解決策は、ifelseまたはsapplyの、Mapの、forループの使用を作ることができますsqrtはすでにベクトル化された関数であり、以下同様である。これは宿題であり、あなたがすでに学んだことに依存します。