diff --git a/shiny/deliQuadLat/server.R b/shiny/deliQuadLat/server.R new file mode 100644 index 0000000000000000000000000000000000000000..3ad9bc26326246fdd307fc3737cb9991b01fa658 --- /dev/null +++ b/shiny/deliQuadLat/server.R @@ -0,0 +1,95 @@ +##------------------------------------------- +## server.R + +## FUNCIONA LOCALMENTE MAS NÃO DÁ CERTO QUANDO MANDA PARA SERVIDORA. ALGO ESQUISITO. + +require(shiny) +## Carrega template das aplicações elaboradas pelo projeto iguiR2 +source("../template.R") +require(lattice) +require(RColorBrewer) + +## Função para aleatorizar experimento em quadrado latino. + +qldesign <- function(dim){ + ## dim: escalar inteiro que é a dimensão do QL. + M <- matrix(1:dim, dim, dim) + N <- M+(t(M)) + O <- (N%%dim)+1 + lin <- sample(1:dim) + col <- sample(1:dim) + M <- O[lin,col] + D <- expand.grid(lin=gl(dim,1), col=gl(dim,1)) + D$trat <- c(M) + return(list(M=M, D=D)) +} + +# da <- qldesign(5) +# +# # display.brewer.all() +# colr <- brewer.pal(9, "Set1") +# colr <- colorRampPalette(colr, space="rgb") +# +# levelplot(trat~lin+col, data=da$D, aspect=1, +# colorkey=FALSE, +# col.regions=colr, +# panel=function(x, y, z, ...){ +# panel.levelplot(x=x, y=y, z=z, ...) +# panel.text(x=x, y=y, labels=LETTERS[z]) +# }) + +shinyServer( + function(input, output, clientData, session){ + ## Cabeçalho IGUIR2 + output$header <- renderPrint({ + template("TEMA") + }) + output$ui <- renderUI({ + if(input$set){ + textInput(inputId="seed", + label="Semente:", + value=1234) + } else { + return() + } + }) + + do <- reactive({ + if(input$set){ + seed <- input$seed + set.seed(seed) + } else { + seed <- sample(100:999, size=1) + set.seed(seed) + } + da <- qldesign(input$size) + da$seed <- seed + return(da=da) + }) + + output$plotRes <- renderPlot({ + da <- do() + colr <- brewer.pal(9, "Set1") + colr <- colorRampPalette(colr, space="rgb") + + levelplot(trat~lin+col, data=da$D, aspect=1, + colorkey=FALSE, + xlab="Linha", ylab="Coluna", + col.regions=colr, + panel=function(x, y, z, ...){ + panel.levelplot(x=x, y=y, z=z, ...) + panel.text(x=x, y=y, labels=LETTERS[z]) + }) + }) + + output$downloadData <- downloadHandler( + filename=function(){ + paste("dql", input$size, "-", do()$seed,".txt", sep="") + }, + content=function(file) { + write.table(x=do()$D, file=file, + quote=FALSE, row.names=FALSE, + sep="\t") + } + ) + }) diff --git a/shiny/deliQuadLat/ui.R b/shiny/deliQuadLat/ui.R new file mode 100644 index 0000000000000000000000000000000000000000..1166e25e0d3980bdbe9df60fdd4898d1297731f2 --- /dev/null +++ b/shiny/deliQuadLat/ui.R @@ -0,0 +1,27 @@ +##------------------------------------------- +## ui.R + +library(shiny) + +shinyUI( + fluidPage( + ## Cabeçalho IGUIR2 + htmlOutput("header"), + + titlePanel("Delineamento Quadrado Latino"), + sidebarLayout( + sidebarPanel( + numericInput(inputId="size", + label="Tamanho do Quadrado Latino:", + min=4, max=20, + step=1, value=5), + checkboxInput(inputId="set", label="Fixar semente."), + uiOutput("ui"), + downloadButton("downloadData", "Download") + ), + mainPanel( + plotOutput("plotRes") + ) + ) + ) +) diff --git a/shiny/distProb/server.R b/shiny/distProb/server.R new file mode 100644 index 0000000000000000000000000000000000000000..27e24c2d348d0e0b240be493bc2a97f3e5f65955 --- /dev/null +++ b/shiny/distProb/server.R @@ -0,0 +1,105 @@ +##------------------------------------------- +## server.R + +require(shiny) +## Carrega template das aplicações elaboradas pelo projeto iguiR2 +source("../template.R") + +shinyServer( + function(input, output){ + ## Cabeçalho IGUIR2 + output$header <- renderPrint({ + template("TEMA") + }) + output$ui <- renderUI({ + if(is.null(input$dist)){ + return()} + switch(input$dist, + "poisson"={ + output$plot <- renderPlot({ + x <- 0:30 + px <- dpois(x, lambda=input$poissonLambda) + plot(x, px, type="h", xlab="x", ylab="Pr(x)") + }) + wellPanel( + sliderInput(inputId="poissonLambda", + label="Média da Poisson", + min=0.1, max=20, value=10) + ) + }, + + "binomial"={ + output$plot <- renderPlot({ + x <- 0:input$binomialSize + px <- dbinom(x, size=input$binomialSize, + prob=input$binomialProb) + plot(x, px, type="h", xlab="x", ylab="Pr(x)") + }) + wellPanel( + sliderInput(inputId="binomialSize", + "Número de ensaios", + min=0, max=30, value=10, step=1), + sliderInput(inputId="binomialProb", + label="Probabilidade de sucesso", + min=0.02, max=0.98, + value=0.5, step=0.02) + + ) + }, + + "beta"={ + output$plot <- renderPlot({ + curve(dbeta(x, + shape1=input$betaShape1, + shape2=input$betaShape2), + from=0, to=1, + xlab="x", ylab="f(x)") + }) + wellPanel( + sliderInput(inputId="betaShape1", + label="Parâmetro de forma 1", + min=0.01, max=7, value=1, step=0.1), + sliderInput(inputId="betaShape2", + label="Parâmetro de forma 2", + min=0.01, max=7, value=1, step=0.1) + ) + }, + + "gamma"={ + output$plot <- renderPlot({ + curve(dgamma(x, + shape=input$gammaShape, + rate=input$gammaRate), + from=0, to=20, + xlab="x", ylab="f(x)") + }) + wellPanel( + sliderInput(inputId="gammaShape", + label="Parâmetro de forma", + min=0.01, max=7, value=1, step=0.1), + sliderInput(inputId="gammaRate", + label="Parâmetro de taxa", + min=0.01, max=7, value=1, step=0.1) + ) + }, + + "normal"={ + output$plot <- renderPlot({ + curve(dnorm(x, + mean=input$normalMean, + sd=input$normalSd), + from=-3, to=3, + xlab="x", ylab="f(x)") + }) + wellPanel( + sliderInput(inputId="normalMean", + label="Média da normal", + min=-3, max=3, value=0, step=0.05), + sliderInput(inputId="normalSd", + label="Desvio-padrão da normal", + min=0.1, max=3, value=1, step=0.05) + ) + } + ) + }) + }) diff --git a/shiny/distProb/ui.R b/shiny/distProb/ui.R new file mode 100644 index 0000000000000000000000000000000000000000..fcdabb6f3141404cb478be7975e1bd38bb88cc40 --- /dev/null +++ b/shiny/distProb/ui.R @@ -0,0 +1,28 @@ +##------------------------------------------- +## ui.R + +require(shiny) + +choi <- c("Poisson"="poisson", + "Binomial"="binomial", + "Beta"="beta", + "Gamma"="gamma", + "Normal"="normal") + +shinyUI( + fluidPage( + ## Cabeçalho IGUIR2 + htmlOutput("header"), + + titlePanel("Distribuições de probabilidade"), + sidebarPanel( + selectInput(inputId="dist", + label="Distribuição", + choices=choi), + uiOutput("ui") + ), + mainPanel( + plotOutput("plot") + ) + ) +) \ No newline at end of file diff --git a/shiny/fastCalc/server.R b/shiny/fastCalc/server.R new file mode 100644 index 0000000000000000000000000000000000000000..7a4178c9f8f8994fb76d3d59ac85097b882348db --- /dev/null +++ b/shiny/fastCalc/server.R @@ -0,0 +1,123 @@ +##------------------------------------------- +## server.R + +## FUNCIONA LOCALMENTE MAS NÃO DÁ CERTO QUANDO MANDA PARA SERVIDORA. ALGO ESQUISITO. + +require(shiny) +## Carrega template das aplicações elaboradas pelo projeto iguiR2 +source("../template.R") + +## Número de alternativas. +nalter <- 4 + +## Hora do acesso. +tm0 <- Sys.time() +tm <- tm0 + +## Remove arquivo de log para criar um novo. +file.remove("log") +cat("expr; timeDes; correctAnswer; userAnswer", sep="\n", file="log") + +shinyServer( + function(input, output, clientData, session){ + ## Cabeçalho IGUIR2 + output$header <- renderPrint({ + template("TEMA") + }) + + ## Responde a estímulos no `input$goButton`. + do <- reactive({ + input$goButton + smpl <- sample(0:9, size=2) + expr <- paste0(smpl[1], " + ", smpl[2], " = ") + erros <- sample(c(-1,1), size=nalter-1, replace=TRUE)*sample(1:5, size=nalter-1) + answers <- sum(smpl)+c(0, erros) + ran <- sample(1:nalter) + return(list(expr=expr, choi=answers[ran], correct=answers[1]) + ) + }) + + ## Apresenta a expressão. + output$expr <- renderText(do()$expr) + + ## Gera o `radioInput()`. Estímulo do `input$goButton` pelo `do()$choi`. + output$uiRadio <- renderUI({ + return( + radioButtons(inputId="radio", + label="", + choices=do()$choi, + selected=NA, + inline=FALSE) + ) + }) + + ## Executado toda vez que clica no `input$radio`. + ## Não responde ao `input$goButton` porque se usou isolate(do()$...). + results <- reactive({ + tm <<- c(Sys.time(), tm) ## Informação do instante. + ## Diferença de tempo só deve aparecer depois de escolher resposta. + d <- 0 + if(!is.null(input$radio)){ + d <- as.numeric(diff(tm[2:1])) ## Diferença entre ações. + } + iscerto <- isolate(do()$correct)==as.integer(isolate(input$radio)) + td <- sprintf("Tempo de decisão: %0.3f", d) + rc <- paste("Resposta correta: ", ifelse(iscerto, "SIM", "NÃO")) + return(list(td=td, + rc=rc, + d=d, + expr=isolate(do()$expr), + corAns=isolate(do()$correct), + userAns=input$radio + ) + ) + }) + + ## Vínculado ao `input$radio`. + output$result <- renderPrint({ + ## Print para usuário. + cat(results()$td, "\n", results()$rc, sep="") + ## cat(results()$rc) + }) + + ## Executado toda vez que clica no botão `input$goButton`. + ## Não depende do `input$radio` por causa do isolate(results()$...). + observe({ + input$goButton + cat(paste( + isolate(results()$expr), ## Expressão. + isolate(results()$d), ## Tempo para decisão. + isolate(results()$corAns), ## Resposta correta. + isolate(results()$userAns), ## Resposta marcada. + sep="; "), + sep="\n", + file="log", + append=TRUE) + }) + + ## Sensível ao `input$goResults` apenas. + output$plotRes <- renderPlot({ + input$goResults + da <- read.table(file="log", sep=";", header=TRUE) + if(nrow(da)>1){ + da <- na.omit(da) + n <- nrow(da) + y <- as.integer(da$userAnswer==da$correctAnswer) + x <- da$time + plot(density(x), + xlab="Tempo para decisão (s)", + ylab="Densidade", + main=NA, + sub=NA) + yr <- 0.05*diff(range(par()$usr[3:4])) + points(x, y*yr, col=y+1) + m <- mean(x, na.rm=TRUE) + p <- sum(y)/nrow(da) + abline(v=m, lty=2) + mtext(side=3, line=2, + text=sprintf("Tempo médio de decisão: %0.3f segundos", m)) + mtext(side=3, line=1, + text=sprintf("Proporção de acertos: %0.2f%s", 100*p, "%")) + } + }) + }) diff --git a/shiny/fastCalc/ui.R b/shiny/fastCalc/ui.R new file mode 100644 index 0000000000000000000000000000000000000000..a9a464757ec2d64d49b3d85fa1f809d63ac875a3 --- /dev/null +++ b/shiny/fastCalc/ui.R @@ -0,0 +1,27 @@ +##------------------------------------------- +## ui.R + +library(shiny) + +shinyUI( + fluidPage( + ## Cabeçalho IGUIR2 + htmlOutput("header"), + + titlePanel("Seja rápido!"), + sidebarLayout( + sidebarPanel( + h5("Qual o resultado da soma?"), + textOutput("expr"), + uiOutput("uiRadio"), + actionButton(inputId="goButton", label="Novo!"), + hr(), + actionButton(inputId="goResults", label="Resultados!") + ), + mainPanel( + verbatimTextOutput("result"), + plotOutput("plotRes") + ) + ) + ) +) diff --git a/shiny/regex/server.R b/shiny/regex/server.R new file mode 100644 index 0000000000000000000000000000000000000000..aa46a0597aa78e6967635f0d1434f8e9d04c410b --- /dev/null +++ b/shiny/regex/server.R @@ -0,0 +1,45 @@ +##------------------------------------------- +## server.R + +require(shiny) +## Carrega template das aplicações elaboradas pelo projeto iguiR2 +source("../template.R") + +shinyServer( + function(input, output){ + ## Cabeçalho IGUIR2 + output$header <- renderPrint({ + template("TEMA") + }) + output$ui <- renderUI({ + switch(input$regexjob, + "grepl"={ + output$text <- renderText({ + grepl(x=as.character(input$string), + pattern=as.character(input$pattern)) + }) + wellPanel( + textInput(inputId="string", + label="Termo:"), + textInput(inputId="pattern", + label="Padrão REGEX:") + ) + }, + "gsub"={ + output$text <- renderText({ + gsub(x=as.character(input$string), + pattern=as.character(input$pattern), + replacement=as.character(input$replacement)) + }) + wellPanel( + textInput(inputId="string", + label="Termo:"), + textInput(inputId="pattern", + label="Padrão REGEX de busca:"), + textInput(inputId="replacement", + label="Padrão REGEX de substituição:") + ) + } + ) + }) + }) diff --git a/shiny/regex/ui.R b/shiny/regex/ui.R new file mode 100644 index 0000000000000000000000000000000000000000..bd1e8d4f198033d033e7af04cfa8e63c466eec79 --- /dev/null +++ b/shiny/regex/ui.R @@ -0,0 +1,25 @@ +##------------------------------------------- +## ui.R + +library(shiny) + +choi <- c("Construção e ajuste"="grepl", + "Procura e substituição"="gsub") + +shinyUI( + fluidPage( + ## Cabeçalho IGUIR2 + htmlOutput("header"), + + titlePanel("Construidor de expressões regulares"), + sidebarPanel( + radioButtons(inputId="regexjob", + label="Uso de expressão regular", + choices=choi), + uiOutput("ui") + ), + mainPanel( + textOutput("text") + ) + ) +) \ No newline at end of file diff --git a/shiny/teoLimCentral/server.R b/shiny/teoLimCentral/server.R new file mode 100644 index 0000000000000000000000000000000000000000..25fa43e720051344bfed7c733effcb263176d693 --- /dev/null +++ b/shiny/teoLimCentral/server.R @@ -0,0 +1,96 @@ +##------------------------------------------- +## server.R + +require(shiny) +## Carrega template das aplicações elaboradas pelo projeto iguiR2 +source("../template.R") +require(latticeExtra) + +rm(list=ls()) + +N <- 500 +n <- c(1,2,3,5,10,20) +da <- data.frame(tam=rep(n, each=N)) + +panel.dens <- function(x, ...){ + panel.densityplot(x, ...) + m <- mean(x) + s <- sd(x) + panel.mathdensity(dmath=dnorm, col="blue", + args=list(mean=m, sd=s)) +} + +panel.fa <- function(x, ...){ + panel.ecdfplot(x, ...) + m <- mean(x) + s <- sd(x) + xx <- seq(min(x), max(x), length.out=20) + panel.lines(xx, pnorm(xx, m, s), col="blue") +} + +# y <- runif(1000) +# ecdfplot(~y, +# data=da, as.table=TRUE, +# xlab=expression(bar(X)), +# ylab="Frequêcia acumulada", +# panel=panel.fa) + +shinyServer( + function(input, output){ + ## Cabeçalho IGUIR2 + output$header <- renderPrint({ + template("TEMA") + }) + output$distBarX <- renderPlot({ + ## Define a distribuiação de probabilidade de X. + barX <- switch(input$distX, + UD5=function(ni){ + mean(sample(1:5, size=ni, replace=TRUE)) + }, + U01=function(ni){ + mean(runif(ni, min=0, max=1)) + }, + N01=function(ni){ + mean(rnorm(ni, mean=0, sd=1)) + }, + E1=function(ni){ + mean(rexp(ni, rate=1)) + }, + Poi5=function(ni){ + mean(rpois(ni, lambda=5)) + }, + BetaA=function(ni){ + mean(rbeta(ni, shape1=0.5, shape2=0.5)) + } + ) + ## Obtém a distribuição de bar(X). + da$barx <- + do.call(c, lapply(as.list(n), + function(ni){ + replicate(N, { + barX(ni) + }) + })) + ## Define parâmetros gráficos. + trellis.par.set(list( + grid.pars=list(fontfamily="palatino"), + strip.background=list(col="gray70"), + plot.line=list(col=1), + plot.symbol=list(col=1)) + ) + ## Representa a distribuição de probabilidades. + p <- switch(input$plotType, + dens=densityplot(~barx|factor(tam), + data=da, as.table=TRUE, + xlab=expression(bar(X)), + ylab="Densidade", + panel=panel.dens), + ecdf=ecdfplot(~barx|factor(tam), + data=da, as.table=TRUE, + xlab=expression(bar(X)), + ylab="Frequêcia acumulada", + panel=panel.fa) + ) + return(print(p)) + }) + }) diff --git a/shiny/teoLimCentral/ui.R b/shiny/teoLimCentral/ui.R new file mode 100644 index 0000000000000000000000000000000000000000..c008fa185606bc35c73f283cadea8a7f80cbbf58 --- /dev/null +++ b/shiny/teoLimCentral/ui.R @@ -0,0 +1,34 @@ +##------------------------------------------- +## ui.R + +require(shiny) + +distX <- c("Uniforme discreta (5)"="UD5", + "Uniforme Contínua (0,1)"="U01", + "Exponencial (1)"="E1", + "Poisson (5)"="Poi5", + "Normal (0,1)"="N01", + "Beta (0.5, 0.5)"="BetaA") +plotType <- c("Densidade empírica"="dens", + "Frequência acumulada"="ecdf") + +shinyUI( + fluidPage( + ## Cabeçalho IGUIR2 + htmlOutput("header"), + + headerPanel("Distribuição amostral da média"), + h4("Explore a convergência da distribuição amostral da média com as opções abaixo."), + hr(), + sidebarPanel( + radioButtons(inputId="distX", + label="Distribuição de X:", + choices=distX), + radioButtons(inputId="plotType", + label="Representação da distribuição amostral:", + choices=plotType) + ), + mainPanel( + plotOutput("distBarX", width=500, height=400) + ) + )) diff --git a/shiny/testHipFlipCoin/server.R b/shiny/testHipFlipCoin/server.R new file mode 100644 index 0000000000000000000000000000000000000000..bbf142a8b74a4aaa77d0042d403a026c08017357 --- /dev/null +++ b/shiny/testHipFlipCoin/server.R @@ -0,0 +1,114 @@ +##------------------------------------------- +## server.R + +require(shiny) +## Carrega template das aplicações elaboradas pelo projeto iguiR2 +source("../template.R") + +rm(list=ls()) + +## Simula o número de trocas ao lançar n vezes uma moeda equilibrada. +moeda <- function(n){ + sum(abs(diff(rbinom(n, 1, 0.5)))) +} + +## Vetor vazio. +x <- integer() +N <- 1000 + +shinyServer( + function(input, output){ + ## Cabeçalho IGUIR2 + output$header <- renderPrint({ + template("TEMA") + }) + # cara <- eventReactive(input$goCara, { + # x <<- c(x, 1L) + # }) + # coro <- eventReactive(input$goCoro, { + # x <<- c(x, 0L) + # }) + # output$nlanc <- renderText({ + # coro(); cara() + # return(length(x)) + # }) + cara <- reactive({ + input$goCara + x <<- c(x, 1L) + }) + coro <- reactive({ + input$goCoro + x <<- c(x, 0L) + }) + ## x começa com dois elementos. Descontá-los. + output$nlanc <- renderText({ + coro(); cara() + return(length(x)-2) + }) + process <- eventReactive(input$goProcess, { + x <- x[-c(1:2)] + ## Número de lançamentos. + n <- length(x) + ## Número de caras. + k <- sum(x) + ## Número de trocas de face. + o <- sum(abs(diff(x))) + ## Faz várias execuções do experimento aleatório. + r <- replicate(N, moeda(n)) + ## P-valor bilateral empírico. + p <- min(c(2*min(c(sum(r<=o), sum(r>=o)))/N, 1)) + ## Lista com todos os elementos. + return(list(n=n, k=k, o=o, r=r, p=p, x=x)) + }) + output$seqx <- renderText({ + s <- paste0(process()$x, collapse="") + return(s) + }) + output$hist <- renderPlot({ + with(process(),{ + if(n<=9){ + stop("Pro favor, lance no mínimo 30 vezes.") + } + par(mar=c(5,4,3,2), family="Palatino") + layout(matrix(c(1,2,1,3), 2, 2)) + bks <- seq(min(c(r,o)), max(c(r,o))+1, by=1)-0.5 + ht <- hist(r, breaks=bks, plot=FALSE) + plot(ht$mids, ht$density, type="h", lwd=2, + ylim=c(0, 1.05*max(ht$density)), + xlab=sprintf("Número de trocas em %i lançamentos", n), + ylab="Probabilidade", + sub=sprintf("%i simulações", N)) + if(input$teorico){ + px <- dbinom(x=ht$mids, size=n-1, prob=0.5) + points(ht$mids+0.1, px, type="h", col="blue") + pb <- 2*pbinom(q=min(c(o, n-o-1)), size=n-1, p=0.5) + mtext(side=3, line=0, col="blue", + text=sprintf("P-valor bilateral teórico: %0.4f", pb)) + } + abline(v=o, col=2) + text(x=o, y=par()$usr[4], + label="Estatística observada", + srt=90, adj=c(1.25,-0.25)) + mtext(side=3, line=1, + text=sprintf("P-valor bilateral empírico: %0.4f", p)) + mtext(side=3, line=2, + text=sprintf( + "Trocas observadas: %i\t Número de caras: %i", + o, k)) + plot(cumsum(x)/seq_along(x), type="l", ylim=c(0,1), + ylab="Frequência de face cara", + xlab="Número do lançamento") + abline(h=0.5, lty=2) + plot(ecdf(r), verticals=TRUE, cex=NA, + main=NULL, xlim=range(bks), + xlab=sprintf("Número de trocas em %i lançamentos", n), + ylab="Probabilidade acumulada", + sub=sprintf("%i simulações", N)) + abline(h=seq(0.05, 0.95, by=0.05), lty=2, col="gray50") + abline(v=o, col=2) + text(x=o, y=par()$usr[4], + label="Estatística observada", + srt=90, adj=c(1.25,-0.25)) + }) + }) + }) diff --git a/shiny/testHipFlipCoin/ui.R b/shiny/testHipFlipCoin/ui.R new file mode 100644 index 0000000000000000000000000000000000000000..be8f9903b8c77fd55dc5ed2e4cdebb8384d4714e --- /dev/null +++ b/shiny/testHipFlipCoin/ui.R @@ -0,0 +1,34 @@ +##------------------------------------------- +## ui.R + +require(shiny) + +txt <- +"Você consegue criar uma sequência de caras e coroas tão aleatória e com as +mesmas características propabilísticas de uma moeda equilibrada? Que tal +testarmos essa hipótese?" + +shinyUI( + fluidPage( + ## Cabeçalho IGUIR2 + htmlOutput("header"), + + headerPanel("Introdução aos testes de hipótese"), + h4("Você consegue imitar uma moeda?"), + p(txt), + hr(), + sidebarPanel( + helpText("Clique nos botões para declarar cara ou coroa."), + actionButton("goCara", "Cara"), + actionButton("goCoro", "Coroa"), + h6("Número de lançamentos feitos:"), + verbatimTextOutput("nlanc"), + actionButton("goProcess", "Aplicar teste de hipótese!"), + h6("Sequência das faces observadas (1=cara, 0=coroa):"), + verbatimTextOutput("seqx"), + checkboxInput("teorico", "Valores teóricos: Binomial(n-1, p=0.5)") + ), + mainPanel( + plotOutput("hist", width=500, height=500) + ) + ))