x <- c(0,0,0,10,10,10,20,20,20,35,35,35)
y <- c(7.77, 7.81, 7.81, 7.60, 7.67, 7.65, 7.60, NA, 7.66, 7.60, 7.42, 7.50)
segment_lpl <- function(x,b0,b1,b2,K,X0,X1){
(b0+b1*x)*(x<=X0)+
(K)*(X0<x & x<X1)+
(b0+b1*X0-b2*(X1-x))*(x>=X1)
}
teste <- nls(y ~ segment_lpl(x,b0,b1,b2,K,X0,X1),
start=list(b0=7.8,b1=-0.02,b2=-0.01,K=7.5,X0=10,X1=20))
library(gWidgetsRGtk2)
limits <- list(b0=c(7,8),
b1=c(-0.05,0),
b2=c(-0.04,0),
K=c(7,8),
X0=c(8,10),
X1=c(18,25))
start <- list() # lista com os valores para chute
#-----------------------------------------------------------------------------
#função que será atualizada a cada movimento do deslizador
#parâmetros dentro de svalue() são controlados, nomes igual aos da lista
plot.chute <- function(...){
#faz o gráfico de dispersão
plot(y ~ x)
#sobrepõe a curva com os valores dos deslizadores
curve(segment_lpl(x, svalue(b0), svalue(b1), svalue(b2), svalue(K),svalue(X0), svalue(X1)),
add=TRUE, col=2)
#reescreve o start com os valores dos delizadores, para usar na nls()
start <- list(b0=svalue(b0), b1=svalue(b1), b2=svalue(b2), K=svalue(K), X0=svalue(X0), X1=svalue(X1))
}
#-----------------------------------------------------------------------------
#criação da janela com deslizadores
#na primeira chamada escolher uma das opções (sempre escolho a 1)
#Select a GUI toolkit
#essa função pode estar num arquivo fn.R e carregada com source("fn.R")
w <- gwindow("Caixa com deslizadores para controlar parâmetros")
tbl <- glayout(cont=w)
for(i in 1:length(limits)){
tbl[i,1] <- paste("Controle", names(limits)[i])
tbl[i,2, expand=TRUE] <- (assign(names(limits)[i],
gslider(from=limits[[i]][1],
to=limits[[i]][2],
by=diff(limits[[i]])/20,
value=mean(limits[[i]]),
container=tbl,
handler=plot.chute)))
}
#
#-----------------------------------------------------------------------------
#agora com a caixa criada, basta chamar a função e mover os deslizadores
plot.chute()