我正在尝试创建一个可以让用户使用的闪亮应用
通过输入不同值的频率计数来创建数据集
绘制该数据集的直方图
一对配对的代码示例如下:
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'”而不是显示了直方图。只要更改任何输入,直方图就会更新。
任何解决问题的帮助将不胜感激。
答案 0 :(得分:0)
您在mydatatable
反应式中定义的mydata在其他任何地方都不可见。为了理解原因,我建议您阅读有关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
只是查找“真实的”东西,这意味着:不是NULL
,不是NA
,不是FALSE
,长度大于0,依此类推。请参见{ {1}}以获得更多详细信息。
虽然?shiny::req
并非严格要求,但它有其优点。从表代码可以推断出,req
将返回“传入的第一个值” (来自req(x)
),因此可以在此快捷方式下使用为简洁起见。
最后一个肥皂盒:以我对?req
反应性的有限经验,很少有几次在反应式块中生成数据并仅在该反应式块中使用数据。鉴于此,每当您创建shiny
(或data.frame
或...依赖于用户输入的某些重要结构)时,使其成为自己的反应性组件通常是有益的(特别是, list
组件),然后根据需要多次依赖它。