2017-03-29 23 views
0

在函數中執行此代碼時,我得到不同的結果。我錯過了什麼?爲什麼我會在功能內外獲得不同的行爲?

,工程代碼:

adf$GarageCond = as.character(adf$GarageCond) 
adf[is.na(adf$GarageCond), "GarageCond"] = "None" 
adf$GarageCond = as.factor(adf$GarageCond)  
adf$GarageCond = ordered(adf$GarageCond, levels=c("None","Po","Fa","TA","Gd","Ex")) 

功能:

cnvtNaAndOrder = function(df, colname) 
{ 
    # 
    # Change NA's to a "None" factor 
    # 
    df[,eval(quote(colname))] = as.character(df[,eval(quote(colname))]) 
    adf[is.na(df[,eval(quote(colname))]), eval(quote(colname))] = "None" 
    df[,eval(quote(colname))] = as.factor(df[,eval(quote(colname))]) 
    df[,eval(quote(colname))] = ordered(df[,eval(quote(colname))], levels=c("None","Po","Fa","TA","Gd","Ex")) 

    return(df) 
} 

代碼的直接執行按預期工作:

adf$GarageCond = as.character(adf$GarageCond) 
adf[is.na(adf$GarageCond), "GarageCond"] = "None" 
adf$GarageCond = as.factor(adf$GarageCond) 
adf$GarageCond = ordered(adf$GarageCond, levels=c("None","Po","Fa","TA","Gd","Ex")) 

summary(adf$GarageCond) 
None Po Fa TA Gd Ex 
    81 7 35 1326 9 2 

str(adf$GarageCond) 
Ord.factor w/ 6 levels "None"<"Po"<"Fa"<..: 4 4 4 4 4 4 4 4 4 4 ... 

執行的是什麼,在我看來是通過函數等效代碼產生警告並得出不同的結果:

adf = cnvtNaAndOrder(adf, "GarageCond") 
Warning message: 
In `[<-.factor`(`*tmp*`, iseq, value = c("None", "None", "None", : 
    invalid factor level, NA generated 

summary(adf$GarageCond) 
None Po Fa TA Gd Ex NA's 
    0 7 35 1326 9 2 81 

str(adf$GarageCond) 
Ord.factor w/ 6 levels "None"<"Po"<"Fa"<..: 4 4 4 4 4 4 4 4 4 4 ... 

看起來as.factor()正在給出警告並且沒有將「無」轉換爲因子。請注意,我也嘗試了df[,"GarageCond"]表單來選擇直接執行代碼中的列,它工作得很好。

我缺少什麼?爲什麼會有不同的行爲?

+1

在你的函數中如何定義adf?它不是函數的參數,函數內部沒有adf的定義。 –

+0

謝謝 - 我無法檢測到一個簡單的錯字。 adf從我的工作區使用,所以錯誤不明確。令人尷尬和費時。 – jch

回答

0

這是一個簡單的錯字,我看不到。

相關問題