library(datasets)
head(airquality)
#按月分組
s <- split(airquality, airquality$Month)
str(s)
summary(s)
lapply(s,function(x) colMeans(x[,c("Ozone","Solar.R","Wind")],na.rm = T))
sapply(s,function(x) colMeans(x[,c("Ozone","Solar.R","Wind")],na.rm = T))
#多函數對照
x <- rnorm(10)
f1 <- gl(2,5)
f2 <- gl(5,2)
interaction(f1,f2)
str(split(x,list(f1,f2))) #list會自動帶入interaction()
str(split(x,list(f1,f2), drop = T)) #捨去空level
#Debug
message: 可能
warning: 意料(期望)之外的事情,提醒
error: 大問題,會stop
condition: 所有都是condition,可設計觸發
invisible() 會返回但不會顯示
printmessage <- function(x) {
if(x>0)
print("positive")
else
print("negative")
}
x<-log(-1) #NaN warning
printmessage2(x) #Error
printmessage2 <- function(x) {
if(is.na(x))
print("missing")
else if(x>0)
print("positive")
else
print("negative")
}
x<-log(-1) #NaN warning
printmessage2(x) #warning NaN => Na
#錯誤處理的思維
input甚麼,如何Call function
所期待的是甚麼,Output? message? other result?
所獲得的是甚麼
差異是甚麼
是否可再現錯誤
#Debugging Tool
1.traceback : 幾個function被呼叫,在哪裡出錯 (只能給出上一次的資料)
2.debug : 函數一開始就暫停,再一行行,搭配browser
3.browser : 函數中的停止點
4.trace : 將debuggingcode插入特別位置
5.recover : 報錯的訊息
mean(xxx)
#Error
traceback()
#1:mean(xxx)
lm(y-x)
#Error
traceback()
4: stats::model.frame(formula = y - x, drop.unused.levels = TRUE)
3: eval(mf, parent.frame())
2: eval(mf, parent.frame())
1: lm(y - x)
debug(lm) #對於lm進入debug模式
lm(y-x) #開始針對lm(y-x)進行debug
#Browse[2]> #一步步檢查
debug: ret.x <- x
#Browse[2]>
debug: ret.y <- y
#Browse[2]>
debug: cl <- match.call()
.
.
#Browse[2]>
Error in stats::model.frame(formula = y - x, drop.unused.levels = TRUE) :
object 'y' not found
可藉由options(error = recover)將recover函數作為錯誤處理器 (此處為globel層級的設定)
tracback中的步驟列表功能,即為recover中的功能,不過recover可以選擇步驟查看其environment