如何使用闪亮的输入/输出读取向量?

Posted

技术标签:

【中文标题】如何使用闪亮的输入/输出读取向量?【英文标题】:How to make to read vectors with inputs/outputs in shiny? 【发布时间】:2021-05-12 12:23:51 【问题描述】:

我正在使用线性回归制作一个闪亮的应用程序。我的输入/输出功能有问题,所以我使用 SelectInput 因为我希望用户可以选择 de 变量进行比较。但问题是输入/输出不采用来自 csv 文件的值。我该如何解决?

代码是:

datos <- read.csv("C:/Users/jerez/OneDrive/Escritorio/UAL/Datos1.csv", sep=";", header = TRUE, stringsAsFactors = FALSE)

ui <- fluidPage(
  headerPanel("Analisis de Regresion"), 
  sidebarPanel(
    #Eleccion de variable x
    p("Selecciona la primera variable a comparar"),
    selectInput(inputId = "varX", label = "Variable eje X", multiple = FALSE, choices = list("NumBusquedas", "FrecuenciaAsistente", "FrecuenciasCorreos", "NumMensajes", "FreqDiscover", "NumUsosApp", "NumPublicidad","NumSuscripciones","NumBusquedasYoutube")),
    #Eleccion de variable y
    p("Selecciona la segunda variable a comparar"),
    selectInput(inputId = "varY", label = "Variable eje Y", multiple = FALSE, choices = list("NumBusquedas", "FrecuenciaAsistente", "FrecuenciasCorreos", "NumMensajes", "FreqDiscover", "NumUsosApp", "NumPublicidad","NumSuscripciones","NumBusquedasYoutube"))
  ),
  mainPanel(
    #verbatimTextOutput(outputId = "Datos"),
    verbatimTextOutput(outputId = "X"),
    verbatimTextOutput(outputId = "Y"),
    verbatimTextOutput(outputId = "coefCorr"),
    plotOutput(outputId = "Grafico")
    
   
    
  )
)

server <- function(input, output) 
  
  output$coefCorr <- renderPrint(cor(input$varX, input$varY))
  output$Grafico <- renderPlot(ggplot(datos, aes(input$varX, input$varY)))
  output$X <- renderPrint(input$varX)
  output$Y <- renderPrint(input$varY)
  

# Run the application 
shinyApp(ui = ui, server = server)

结果如下: result

谢谢! :)

【问题讨论】:

【参考方案1】:

两个问题:

    input$* 变量是character,而不是您认为的数字。使用datos[[input$*]]

    同样适用于ggplot;指定美学的首选程序化方式是通过.data[[ input$* ]]。 (我之前建议首选aes_string,它是deprecated。感谢@starja 帮助我看到。)

如何解决下次进入此绑定时:在导致问题的块的开头插入browser()。 (另一种方法是使用我在此答案底部包含的技术。)现在,我将选择:

  output$coefCorr <- renderPrint(
    browser()
    cor(input$varX, input$var)
  )

(由于我没有您的数据,我将从datos &lt;- mtcars 开始,并将两个选择输入更改为choices=names(datos)。)

当您运行该应用程序时,它应该立即放入您控制台上的调试器中,等待执行下一行代码 (cor(...))。幸运的是,我们在一个renderPrint 里面,它将sink(.) 所有的输出。虽然这是设计使然,但在我们停止 sinking 之前,我们将在控制台上实现零交互。为此,sink(NULL) 会阻止它。

sink(NULL)
input$varX
# [1] "mpg"
input$varY
# [1] "mpg"
cor("mpg", "mpg")
# Error in cor("mpg", "mpg") : 'x' must be numeric

在两个字符串上运行correlation 有意义吗?你可能需要的是datos[[input$varX]]:

cor(datos[[input$varX]], datos[[input$varY]])
# [1] 1

当然这是完美的“1”,这次都是同一个变量。为了演示,我将退出调试器,将 Y 变量更改为"disp",然后重新进入调试器:

cor(datos[[input$varX]], datos[[input$varY]])
# [1] -0.8475514

这解决了numeric 错误。

不过,一旦你开始尝试绘图,你就会发现你还有另一个问题。 (我将继续使用renderPrint 中的当前调试器,只是因为它很方便。)我将添加geom_point() 以便显示一些内容。

ggplot(datos, aes(input$varX, input$varY)) + geom_point()

这只是一个点。两个轴都是分类变量,其值为"mpg""disp"。在这种情况下,我们与aes() 对抗ggplot2 的非标准评估。相反,告诉 ggplot 你给它 strings, with

ggplot(datos, aes(.data[[ input$varX ]], .data[[ input$varY ]])) + geom_point()

底线,这就是这两个服务器块的样子:

  output$coefCorr <- renderPrint( cor(datos[[input$varX]], datos[[input$varY]]) )
  output$Grafico <- renderPlot(ggplot(datos, aes(.data[[ input$varX ]], .data[[ input$varY ]])) + geom_point())

(我仍在推断geom_point,不过这只是为了演示。)


旁注:在学习和开发闪亮的应用程序时,我经常插入一个按钮和observe,只是为了让我直接访问,而不是在render 块内。例如,

ui <- fluidPage(
  headerPanel("Analisis de Regresion"), 
  sidebarPanel(
    actionButton("debug", "DEBUG!"),
    # ...
  ),
  mainPanel(
    # ...
  )
)
server <- function(input, output) 
  observeEvent(input$debug,  req(input$debug); browser(); 1; )
  # ...

当您遇到问题并且不想停止闪亮的应用程序只是插入browser() 并重新运行它时,只需按下按钮。

(这不应该部署到闪亮的服务器上,它只与本地模式相关。事实上,我相信尝试使用browser() 部署应用程序应该会触发警告,如果不是更多的话。无论如何,不​​要' t 尝试使用远程服务器上的调试按钮 :-)

【讨论】:

很好的解释,只是对aes_string的评论。它已被软性弃用,现在建议改用.data[[input$*]],参见例如here 谢谢,我还没有听说aes_string 已被弃用,谢谢提醒。 谢谢!你在这方面帮了我很多忙!我是那个jejeje的新手。你解释得很好。再次感谢你! :) 如果这回答了你的问题(不急!),请回来accept it。谢谢!

以上是关于如何使用闪亮的输入/输出读取向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在闪亮中使用 lapply 存储输出?

如何在ui中使用使用反应函数作为输入的结果? -r 闪亮

如何将闪亮的输入值转换为闪亮的输出表

如何使用 cin 将整数从控制台读取到向量中

闪亮:如何输入用双引号(“)分隔的文本字符串列表

如何使用 Shinyauthr 库在闪亮中创建登录而不在 R 中显示主面板?