如何使 inputs/outputs 以闪亮的方式读取向量?
How to make to read vectors with inputs/outputs in shiny?
我正在使用线性回归制作一个闪亮的应用程序。 inputs/outputs 函数有问题,所以我使用 SelectInput,因为我希望用户可以选择 de 变量进行比较。但问题是 input/output 不采用来自 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
谢谢! :)
两个问题:
input$*
变量是 character
,而不是你认为的数字。使用 datos[[input$*]]
.
同样适用于ggplot
;指定美学的首选 程序化 方式是通过 .data[[ input$* ]]
代替。 (我之前建议 aes_string
是首选,它是 deprecated。感谢@starja 帮助我看到了。)
如何解决这个问题 下次您进入此绑定时:将 browser()
插入导致问题的块开头的某处。 (另一种方法是使用我在此答案底部包含的技术。)现在,我将选择:
output$coefCorr <- renderPrint({
browser()
cor(input$varX, input$var)
})
(因为我没有你的数据,我将从 datos <- mtcars
开始,并将两个 select 输入更改为 choices=names(datos)
。)
当您 运行 该应用程序时,它应该立即进入控制台上的调试器,等待执行下一行代码 (cor(...)
)。幸运的是,我们在 renderPrint
中,它将 sink(.)
所有输出。虽然这是设计使然,但在我们停止 sink
ing 之前,我们将在控制台上获得零交互。为此,sink(NULL)
停止它。
sink(NULL)
input$varX
# [1] "mpg"
input$varY
# [1] "mpg"
cor("mpg", "mpg")
# Error in cor("mpg", "mpg") : 'x' must be numeric
运行 cor
两个字符串的关系有意义吗?您可能需要的是 datos[[input$varX]]
:
cor(datos[[input$varX]], datos[[input$varY]])
# [1] 1
当然这是完美的“1”,这次都是同一个变量。为了演示,我将退出调试器,将 Y 变量更改为 "disp"
,然后 re-enter 调试器:
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
的 non-standard 评估。相反,告诉 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()
和 re-run 时,只需按下按钮。
(这不应该部署到闪亮的服务器,它只与本地模式相关。事实上,我认为尝试使用 browser()
部署应用程序应该触发警告,如果不是更多的话。要么方式,不要尝试使用远程服务器上的调试按钮:-)
我正在使用线性回归制作一个闪亮的应用程序。 inputs/outputs 函数有问题,所以我使用 SelectInput,因为我希望用户可以选择 de 变量进行比较。但问题是 input/output 不采用来自 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
谢谢! :)
两个问题:
input$*
变量是character
,而不是你认为的数字。使用datos[[input$*]]
.同样适用于
ggplot
;指定美学的首选 程序化 方式是通过.data[[ input$* ]]
代替。 (我之前建议aes_string
是首选,它是 deprecated。感谢@starja 帮助我看到了。)
如何解决这个问题 下次您进入此绑定时:将 browser()
插入导致问题的块开头的某处。 (另一种方法是使用我在此答案底部包含的技术。)现在,我将选择:
output$coefCorr <- renderPrint({
browser()
cor(input$varX, input$var)
})
(因为我没有你的数据,我将从 datos <- mtcars
开始,并将两个 select 输入更改为 choices=names(datos)
。)
当您 运行 该应用程序时,它应该立即进入控制台上的调试器,等待执行下一行代码 (cor(...)
)。幸运的是,我们在 renderPrint
中,它将 sink(.)
所有输出。虽然这是设计使然,但在我们停止 sink
ing 之前,我们将在控制台上获得零交互。为此,sink(NULL)
停止它。
sink(NULL)
input$varX
# [1] "mpg"
input$varY
# [1] "mpg"
cor("mpg", "mpg")
# Error in cor("mpg", "mpg") : 'x' must be numeric
运行 cor
两个字符串的关系有意义吗?您可能需要的是 datos[[input$varX]]
:
cor(datos[[input$varX]], datos[[input$varY]])
# [1] 1
当然这是完美的“1”,这次都是同一个变量。为了演示,我将退出调试器,将 Y 变量更改为 "disp"
,然后 re-enter 调试器:
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
的 non-standard 评估。相反,告诉 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()
和 re-run 时,只需按下按钮。
(这不应该部署到闪亮的服务器,它只与本地模式相关。事实上,我认为尝试使用 browser()
部署应用程序应该触发警告,如果不是更多的话。要么方式,不要尝试使用远程服务器上的调试按钮:-)