r - 绘制直方图时如何在闪亮的应用程序中修复“找不到对象'mydata'”
问题描述
我正在尝试创建一个闪亮的应用程序,让用户
通过输入不同值的频率计数来创建数据集
绘制该数据集的直方图
一个双反的代码示例如下:
library(shiny)
library(ggplot2)
# Define UI for application
ui <- fluidPage(
# Sidebar with inputs
sidebarLayout(
sidebarPanel(
numericInput("data1s",
"How many have a score of 1?",
value = 0,
min = 0
),
numericInput("data2s",
"How many have a score of 2?",
value = 0,
min = 0
),
sliderInput("bins",
"Number of bins:",
min = 1,
max = 3,
value = 1)
),
# Show a plot of the data
mainPanel(
htmlOutput("mydatatable"),
plotOutput("distPlot")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
#show the data
output$mydatatable <- renderTable({
#create the dataframe from the frequncies
mydata <- data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s))
)
}
)
#show the histogram
output$distPlot <- renderPlot({
ggplot(mydata, aes(x=our_data)) +
geom_histogram(bins = input$bins)
})
}
# Run the application
shinyApp(ui = ui, server = server)
我已经实现了数据集的创建,但是显示数据直方图的代码返回错误:“找不到对象'mydata'”而不是显示直方图。每当任何输入发生更改时,直方图都应该更新。
任何帮助解决将不胜感激。
解决方案
您在响应式中定义的 mydata 在mydatatable
其他任何地方都不可见。要了解原因,我建议您阅读 R 的命名空间和环境;一个很好的教程是 Hadley 的Advanced R - Environments。
要修复它,我建议您将数据本身设置为反应块,并在其他两个块(表格和绘图)中依赖它:
server <- function(input, output) {
mydata <- reactive({
req(input$data1s, input$data2s)
data.frame(our_data=c(rep(1,input$data1s),rep(2,input$data2s)))
})
#show the data
output$mydatatable <- renderTable({ req(mydata()); })
#show the histogram
output$distPlot <- renderPlot({
req(mydata())
ggplot(mydata(), aes(x=our_data)) +
geom_histogram(bins = input$bins)
})
}
(未经测试。)
我添加了req
仅用于防止应用程序中的启动抖动和警告/错误。当闪亮的应用程序正在预热时,输入变量通常为空(NULL
),依赖它的东西会暂时产生错误,直到输入稳定。(例如,为什么事情会失败,input$data1s
最初可能会显示一个NULL
值,然后尝试看看是否data.frame(our_data=rep(1,NULL))
会起作用。)
req
只是寻找“真实”的东西,意思是: not NULL
, not NA
, not FALSE
,长度大于 0 等。有关?shiny::req
详细信息,请参阅。
虽然req
不是严格要求,但它有其优点。正如您可以从表代码中推断的那样,req(x)
将返回“传入的第一个值”(from ?req
),因此为了简洁起见,它可以在此快捷方式中使用。
最后一个肥皂盒:在我有限的shiny
反应性经验中,我很少在反应性块中生成数据并仅在该反应性块中使用它。鉴于此,每当您创建一个data.frame
(或list
或...一些依赖于用户输入的重要结构)时,将其设为自己的反应组件(特别是,不是output
组件)通常是有益的,然后尽可能多地依赖它必要时。
推荐阅读
- python - 有没有办法一次在某个列上输出 Pandas.groupby 中的 df.min、df.max 和 df.mean?
- javascript - p-queue 是否使用多个线程?
- postgresql - 用于插入记录的 PostgreSQL 函数未按预期工作
- r - Daisy 不采用分类变量的向量
- android - Android 泛化 kotlin 函数,返回任意类,取任意参数
- mysql - 从 gz 文件中恢复一张表
- c# - 没有可用于服务此操作的连接 - 带有 StackExchange.Redis 的 Redis
- arrays - Angular 基于另一个使用 ForkJoin 的 get 返回的数组执行 get 服务
- firebase - 使用 Flutter 在 Firebase 中搜索字段
- python - 如何将选定列的值存储在单独的行中?