в блестящем, Как вставить математические символы в текстовом вводе, чтобы мой код r выполнял уравнения? - PullRequest
0 голосов
/ 04 апреля 2020

Я создал блестящее приложение, в котором мои входные данные распознают только цифры c. Например, в текстовое поле я вставляю 2 ^ 7, и он не выполняет процедуру в моей функции из кода R. С другой стороны, если я вставлю 128, он выполнит процедуру.

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),
  texticInput("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)
     }

   ### Ahora para mostrar los valores guardados:
   observeEvent(input$generador, { 


    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) )

    })

   valores = reactive({ switch (input$metodo, 
   Multiplicativo = 
   Congruencial.Multiplicativo(input$z0,input$a,input$m,input$n),
   Lineal = Congruencial.Lineal(input$z0,input$m,input$a,input$c,input$n),
   SimuladorR = Simulador.R(input$n) )})   #Cierra valores


   numord = valores() #Llamamos los valores aleatorios generados
   mostrar = as.data.frame(cbind(seq(1,input$n,by=1),numord))
   colnames(mostrar)=c("i", "u")
   output$tablaValores = renderTable(mostrar)

  }) #Cierra observeEvent

Теперь это часть кода, в которой мне нужно, чтобы ввод текста был распознан как цифра c, чтобы приложение могло Работа. Значения, которые мне нужно приложению, чтобы прочитать как строку и превратить их в цифры c, это z0, n, m, c. Я попытался поместить их в событие наблюдения, и ни один из них не работает.

Приложение создает серию полуслучайных значений с генераторами, которым требуются некоторые входные значения, указанные в абзаце выше.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

eval(text = parse(......)) работает нормально, но это опасно. Таким способом можно превратить любую строку в вычисляемую R-команду, например команду, которая удаляет некоторые файлы ...

Поскольку вводимые вами строки являются математическими выражениями, вы можете использовать пакет Ryacas для оценки их. Ryacas потерпит неудачу, если строка не является математическим выражением.

library(Ryacas)
.......

valores = eventReactive(input$generador, { 

  z0 = as.numeric(yac_str(sprintf("N(%s)", input$z0)))
  a = as.numeric(yac_str(sprintf("N(%s)", input$a)))
  m = as.numeric(yac_str(sprintf("N(%s)", input$m)))
  c = as.numeric(yac_str(sprintf("N(%s)", input$c)))
  n = as.numeric(yac_str(sprintf("N(%s)", input$n)))
  ......
0 голосов
/ 04 апреля 2020

Вот демонстрация, которая может быть полезна. Вы можете ввести строку символов, а затем использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...