функция, которую я пишу, определяет поведение физического переключателя: он должен быть включен, если значение превышает верхний порог, и может снова отключаться, если он опускается ниже нижнего порога. аналогичная логика описала бы обычный термостат в домашней печи. очевидно, я хочу, чтобы он работал на векторах, вот и весь смысл!
так что если у меня есть данные
S <- c(50, 100, 150, 180, 210, 200, 190, 182, 175, 185, 195, 205)
моя функция сообщает, в норме ли температура в духовке. логическая инверсия «включить духовку».
R> thresholdOnOff(S, 180, 200)
[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE
вопрос касается стиля программирования: сначала я попытался написать его с помощью функции 'apply', но я забыл учитывать окружение ... поэтому я написал рабочую версию с циклом 'for', который Мне не понравилось, потом вспомнил об окружающей среде, и я не уверен насчет двух версий:
thresholdOnOff <- local( {
## following the R inferno
f <- function(series, lower, upper, initialValue=FALSE) {
status <<- initialValue
switchOnOff <- function(x) {
if(x > upper)
status <<- TRUE
if(x < lower)
status <<- FALSE
return(status)
}
sapply(series, switchOnOff)
}
} )
thresholdOnOff <- function(series, lower, upper, initialValue=FALSE) {
## just guessing and reading from the documentation
status <- initialValue
switchOnOff <- function(x) {
if(x > upper)
assign('status', TRUE, inherits=TRUE)
if(x < lower)
assign('status', FALSE, inherits=TRUE)
return(status)
}
sapply(series, switchOnOff)
}