2017-07-27 30 views
0
loess.smooth <- function(dat) { 
    dat <- dat[complete.cases(dat),] 

    ## response 
    vars <- colnames(dat) 
    ## covariate 
    id <- 1:nrow(dat) 
    ## define a loess filter function (fitting loess regression line) 
    loess.filter <- function (x, span) loess(formula = paste(x, "id", sep = "~"), 
              data = dat, 
              degree = 1, 
              span = span)$fitted 
    ## apply filter column-by-column 
    new.dat <- as.data.frame(lapply(vars, loess.filter, span = 0.75), 
          col.names = colnames(dat)) 
} 

當我嘗試應用loess.smooth到數據幀,我得到的錯誤:無效的類型(關閉)的變量,它是不是一個函數

Error in model.frame.default(formula = paste(x, "id", sep = "~"), data = dat) : 
    invalid type (closure) for variable 'id' 

我不明白爲什麼這是一個因爲id不是一個函數,這是錯誤所暗示的。 當我在函數外面運行這些代碼行時,它完全正常工作,完全按照我希望的方式執行。

回答

1

這是一個範圍問題,涉及將一個字符串向量傳遞給loess函數,而不是傳遞一個公式向量。問題是前者的環境返回NULL,因此loess不知道在哪裏找到它。如果您將公式包含在as.formula中,則可以使用該公式。默認情況下,該變量將被分配給函數調用中的本地環境。

至於隱含錯誤,它發生在從另一個已加載的包中爲某個給定函數命名同一個變量的變量時,因爲如果某個函數在本地環境中未找到變量,它將在該函數的加載包。在我的情況下,id函數由dplyr庫加載。

相關問題