2016-03-21 9 views
0

以下、c_dataと呼ばれるデータフレームを作成します。変数riには値が1つ欠けていることに注意してください。関数のNULL出力はどこから来ますか?

次に、データをチェックする関数を記述します。 1つのステップは、riにデータがない場合に機能を停止することです。 (私は機能から私の質問に関連する構文を削除しました)。

出力を提供します。

期待される結果に加えてNULLを出力する点を除いて、この関数は期待どおりに機能します。なぜそれがNULLを印刷しますか?

#create data to test function 
r <- c(.15, .10, NA) 
N <- c(100, 86, 56) 
chrvar <- c("a", "b", "c") 
c_data <- as.data.frame(cbind(r,N, chrvar)) 
#change variable type from factor to numeric 
c_data$r <- as.numeric(c_data$r) 
#change N variable type from factor to integer 
c_data$N <- as.integer(c_data$N) 
#change chrvar from factor to character 
c_data$chrvar <- as.character(c_data$chrvar) 
str(c_data) 


myFun <- function(ri= ri, ni=ni, data = data) 
{ 

    #add ri and ni to the data frame named data 
    data$ri <- ri 
    data$ni <- ni 

    #does ri have any missing data 
    num.missing.ri <- 0 
    for (i in 1:nrow(data)) 
    { 
     if (is.na(data$ri[i] == TRUE)) num.missing.ri = num.missing.ri + 1 
    } 
    if(num.missing.ri != 0) 
    { 
    print(cat("Number of missing values in ri is", num.missing.ri,"\n")) 
    stop("ri has missing data. myFun is terminated.") 
    } 

} 

     myFun(ri = r, ni = N, data = c_data) 

これは、この出力を生成します

myFun(ri = r, ni = N, data = c_data) 

##Number of missing values in ri is 1 
##NULL 
## Error in myFun(ri = r, ni = N, data = c_data) : 
## ri has missing data. myFun is terminated. 

なぜそれがNULLを印刷していますか?

+0

'sum(is.na(data $ column)) 'を使用して列の欠損値の数を取得することができます – adibender

+0

これは、関数が実際に値を返さず、その状態でおそらく関数を定義するときに 'return'コマンドを実装しようとしますか? – cgage

+0

カップルのもの:最初に私は気付いた(is.na(データ$ ri [i] == TRUE))は、値が真であるかどうかをチェックしています。あなたの角括弧は一致しません。あなたがやっていることは、私の前で述べたように、1行で行うことができます。 – Marsenau

答えて

4

NULLが返されます。戻り値はcatです。 printcatは必要ありません。あなたのケースcat

x <- cat("asdf") 
x 
##NULL 
print(x) 
##NULL 

は、欠損値に関する情報を出力し、その後printはFYI NULL

あるcatによって返される値は、出力します:あなたは、これは、より効率的に行うことができ、例えば:

if(any(ind.na <- is.na(c_data$ri))) stop(paste("ri has", sum(ind.na), "missing values")) 
+0

また、 'cat'の代わりに' paste'を使うだけで、あなたはNULLプリントを見ることができません。 – giraffehere

+0

ありがとうございました>私は非常に感謝します。 – user2502904

+0

@ user2502904ようこそ、あなたを助けた回答を受け入れることを忘れないでください(これまでの質問でも同様です) – adibender

1

@adibenderがこれに正しく回答しました。

print(paste("Number of missing values in ri is", num.missing.ri)) 

また、私はちょうどあなたが機能を初めて使用するので、メモしておきたかった:

cat("Number of missing values in ri is", num.missing.ri,"\n") 

またはこの:

ちょうどこれを行います。関数myFunを書くときは、変数のデフォルトのケースを設定しています。

function(ri = ri, ni = ni, data = data)のように関数をインスタンス化すると、関数呼び出しからri、ni、および/またはdataを削除した場合、代わりにri、ni、またはdataを使用するということをRに伝えます。 。 ri、ni、またはデータを他の場所でインスタンス化していない限り、実際に関数には意味がありません。

代わりに、function(ri, ni, data)という名前の関数を書くだけで、この引数を使用しないとエラーが返されます。

関連する問題