Вот демонстрация, которая может быть полезна. Вы можете ввести строку символов, а затем использовать eval(parse(text = ...
для оценки выражения.
library(shiny)
ui <- fluidPage(
textInput("ti_math", "Enter formula:"),
textOutput("to_result")
)
server <- function(input, output, session) {
output$to_result <- renderText({
eval(parse(text = input$ti_math))
})
}
shinyApp(ui, server)
Редактировать : Спасибо за предоставление дополнительного кода. Мне не удалось воспроизвести полностью (отсутствует valores()
), но я думаю, что могу сделать пару предложений.
Для z0, n, m, c вы можете получить доступ к входам через input$z0
, et c.
Попробуйте это:
observeEvent(input$generador, {
z0 = eval(parse(text = input$z0))
print(z0)
})
Вы должны увидеть в консоли, что если вы предоставите что-то вроде 3^4
для z0
, оно должно показать 81 и быть цифрой c.
Вы можете сделать то же самое для n, m, c - я предполагаю, что вы можете обращаться к этим переменным в valores()
или другом reactive
выражении.
Я также заметил, что у вас есть output$grafica
и output$tablaValores
внутри вашего observeEvent
- я бы порекомендовал удалить их из observeEvent
. Одна стратегия состоит в том, чтобы использовать something <- eventReactive(input$generador, {...
и затем вызывать something()
из выходных данных графиков и таблиц.
Редактировать : Спасибо за предоставление valores()
. Теперь я могу предоставить что-то более воспроизводимое.
Я включил eval(parse(text = input$...))
для z0, n, a, m, c. Это внутри valores()
, так что все функции, использующие эти значения для вычислений, будут сначала оцениваться для математических символов.
Обратите внимание, что я переместил renderTable
и renderPlot
из observeEvent
и изменил observeEvent
на eventReactive
, который будет реагировать на кнопку действия.
Я также изменил ui
и server
на отдельные компоненты, а затем в конце вызываю shinyApp
(просто предпочтение).
Это обеспечивает таблицу и график при нажатии кнопки. Пожалуйста, дайте мне знать, если это ближе.
library(shiny)
library(shinythemes)
library(shinydashboard)
library(stringr)
library(ggplot2)
ui = navbarPage(
theme = shinytheme("superhero"),
title = "Generador de Numeros Aleatorios",
tabPanel(title = h5("Generadores"),
sidebarPanel(
selectInput("metodo", "Selecciona el m?todo",
selected= "Multiplicativo",
choices = c("Multiplicativo","Lineal","SimuladorR")
),
textInput("z0","Ingresa una semilla:",value = 3),
textInput("n","Ingresa 'n':",value=10),
textInput("a","Ingresa 'a':",value=2),
textInput("m","Ingresa 'm':", value=15),
textInput("c","Ingresa 'c':",value=10),
actionButton("generador", label = "Generar"),
br(),
radioButtons("type", "Formato de descarga:",
choices=c("Excel(CVS)", "Text(TSV)"),selected = "Excel(CVS)", inline=T),
helpText("Click en el boton de Exportar para descragar los datos."),
downloadButton('downloaddata','Exportar')
#downloadButton("exportador", label = "Exportar")
#actionButton("exportador", label = "Exportar"),
#br(),
#helpText("Click en el boton de Exportar para descargar los datos"),
), #Cierra sidebarPanel
mainPanel(
h5("Valores Generados:"),
plotOutput("grafica"),
tableOutput("tablaValores")
) #Cierra mainPanel
)
)
server = function(input, output,session){
## Generador Multiplicativo
Congruencial.Multiplicativo = function(z0,a,m,n){
z<-c()
u<-c()
z[1]<-z0
u[1]<-z[1]/m
if(n>1){
for (i in 1:n+1) {
z[i]<-(a*z[i-1]) - floor((a*z[i-1])/m)*m
}
for(i in 1:n+1){
u[i]<-z[i]/m
}
}
return(u[-1])
}
## Generador Lineal
Congruencial.Lineal<-function(z0,m,a,c,n){
z=c()
k=c()
u=c()
z[1]=z0
k[1]=floor(((a*z[1])+c)/m)
for(i in seq(2,n+1,by=1)){
z[i]=((a*z[i-1])+c)-(m*k[i-1])
k[i]=floor(((a*z[i])+c)/m)
u[i]=z[i]/m
}
return(u[-1])
}
## Generador de R
Simulador.R = function(n){
r<-runif(n=n,min=0,max=1)
return(r)
}
valores = eventReactive(input$generador, {
z0 = eval(parse(text = input$z0))
a = eval(parse(text = input$a))
m = eval(parse(text = input$m))
c = eval(parse(text = input$c))
n = eval(parse(text = input$n))
switch (input$metodo,
Multiplicativo = Congruencial.Multiplicativo(z0,a,m,n),
Lineal = Congruencial.Lineal(z0,m,a,c,n),
SimuladorR = Simulador.R(n)
)
}) #Cierra valores
output$tablaValores = renderTable({
numord = valores() #Llamamos los valores aleatorios generados
mostrar = as.data.frame(cbind(seq(1,input$n,by=1),numord))
colnames(mostrar)=c("i", "u")
mostrar
})
output$grafica = renderPlot ({
datos = valores()
datos = as.data.frame(datos)
ggplot(datos)+geom_histogram(aes(x=datos,y=..density..),
breaks=seq(0, 1, .01),closed="left",
color="white", fill="orange")+
labs(title="Funcion de Densidad",
x=" x ",
y = "Densidad"
)+theme_bw()+
scale_x_continuous(breaks =seq(0, 1, 0.1))+
scale_y_continuous(breaks =seq(0, 1, 0.1))+
stat_function(fun=dunif,xlim=c(-.5,1.5),size=1,color="red",
args =list(min=0, max=1) )
})
}
shinyApp(ui, server)