Я долго искал решение, но до сих пор не получил его работу. Я очень благодарен за каждое полезное предложение!
Я пытаюсь определить кусочно-линейную функцию в R, это означает, что я хочу определить функцию, которая имеет разные линейные выражения на разных интервалах. Эти интервалы зависят от точек данных (и количества этих точек данных), заданных в xWerte и yWerte, поэтому количество точек отсечения и различных правил функций не являются фиксированными (вот почему я пробую эту хрень с циклами for, а не с ifelse-конструкция...)
До сих пор я пытался определить разрезы (точки разреза интервалов) и значения = правила функции на каждом из этих интервалов. Я записываю код, чтобы вы могли понять, что я сделал, хотя мне кажется, что эта часть работает, и мой вопрос не касается этой части моего кода...
# cuts contains the points where the function rule changes, this works fine
cuts <- c(xWerte[2])
for(i in 3:length(xWerte)-1){
cuts <- c(cuts,xWerte[i+1])
}
cuts
# vals is supposed to contain the function rules in each interval
vals <- c()
for(i in 1:(length(xWerte)-1)){
# fi -> function rule in the i.th interval, also works fine...
fi <- function(x){
return(as.numeric(m[[i]])*x
+(as.numeric(yWerte[i])
-as.numeric(m[[i]])*as.numeric(xWerte[i])))
}
# here, I want to add the i different function rules to the values
vals <- c(vals,fi)
}
# searchInt looks up the interval x is in, works fine
searchInt <- function(x){findInterval(x, c(0, cuts),rightmost.closed = TRUE)}
Кажется, все это делает то, что я хочу. А теперь моя проблема:
# fx should insert x to the function in vals
# that belongs to the interval x is located in...
fx <- function(x){vals[[searchInt(x)]](x)}
# one example with x= 0.8
print(fx(0.8))
Это показывает мне
[1] 0.619
который равен vals[length(vals)]=vals[6]. Но поскольку searchInt(0.8) = 5, он должен показывать vals[5]=0,63806.
Я знаю, что мне удалось добавить в vals разные правила функций, потому что если я это сделаю
for(i in 1:length(vals)){
print(vals[[i]](0.8))}
R показывает мне
[1] 0.15216
[1] 0.5143
[1] 0.5143
[1] 0.59998
[1] 0.63806 # this is vals[[5]](0.8), the result fx(0.8) should evaluate to...
[1] 0.619
Итак, правильные правила функций для разных интервалов есть, но они не могут быть правильно вызваны fx. Мне кажется, что R «забыл», что раньше в vals были разные правила функций. Он просто вызывает последнее функциональное правило, добавленное к vals, независимо от значения searchInt(x).
Я узнал, что это может быть проблема локальных и глобальных переменных, но я не знаю, как это исправить :(
Большое спасибо, что читаете и пытаетесь мне помочь!
P.S.: Извините за ошибки. Я не носитель языка, но старался изо всех сил ;)
vals
, и ваша проблема в том, что вызывается неправильная функция, потому что[searchInt(x)]
не возвращает правильный индекс дляvals
. Поместитеbrowser()
в строке передfx <- function(x){vals[[searchInt(x)]](x)}
, затем введитеsearchInt(x)
, когда вы находитесь в браузере, чтобы увидеть, получаете ли вы правильный индекс. - person Vlo   schedule 20.08.2014vals <-list()
вместоvals <- c()
, а затем сделатьvals[[i]] <- fi
вместоvals <- c(vals,fi)
. Я не совсем понимаю ваш вопрос. Если вышеуказанное не работает, попробуйтеfx <- function(x){vals[[searchInt(x)-1]](x)}
, так как вы упомянули, что ваш индекс отключен на 1. - person Vlo   schedule 20.08.2014vals <- list()
for(i in 1:5){fi <- function(x){x*i}
vals[[i]] <- fi}
Затем я вызываю vals и получаю:[[1]] function (x) {x * i}
[[2]] function (x) {x * i}
и т. д., где мне нужно [[1]] function(x) {x*1}, [[2]] function(x) { x * 2} и т. д. Таким образом, R не понимает, что я должен определить правило функции, но не должен вычисляться снова, когда я вызываю функцию. - person Sunny   schedule 20.08.2014