我希望我闪亮的应用程序能够绘制具有不同列数的数据框。由于我不希望数据包含超过5列,因此我为ggplot对象编写了所有可能情况的显式列表。我还希望使用UI上的滑块来可变第一个对象的大小。
问题是该滑块的值仅可用于多于一列的数据。
要对此进行测试,请参见带有一个数据列的示例数据: https://drive.google.com/file/d/182Qi-2I37OscSeLir_AyXdoedstIxx6D/view?usp=sharing
这里有两个: https://drive.google.com/file/d/1eB0eKvgfj94xIp80P0SG3QnoGZJ1Zq9a/view?usp=sharing
这是我的第一个问题,我不确定如何使用fileInput为闪亮的应用程序提供理想的示例。请让我知道是否有比这更好的方法。
#The ui
shinyUI(
pageWithSidebar(
headerPanel(""),
sidebarPanel(
fileInput(inputId = "file", label = "Choose an Excel (.xlsx) File",
multiple = FALSE,
accept = c("text/xlsx", "text/microsoft-excel-pen-XML-format-spreadsheet-file", ".xlsx"),
width = NULL, buttonLabel = "Find...",
placeholder = "No File selected"
),
sliderInput(inputId = "width", label = "width", min = 0.01, max = 0.4, value = 0.2, step = 0.01)),
mainPanel(plotOutput("graph"), height = "600px", quoted = TRUE)
)
)
#and the server
library(shiny)
library(ggplot2)
library(readxl)
shinyServer(function(input, output, session) {
data <- reactive({
data.frame(read_xlsx(input$file$datapath))
})
output$graph <- renderPlot({
print(
#somehow the interactive heigth setting is now muted within the expression
ggplot(data(), aes(x = data()[,1], y = "", fill = as.factor(data()[2:ncol(data())])) ) +
{if(ncol(data()) >= 2)geom_tile(aes(x = data()[,1], y = 0, fill = as.factor(data()[,2])), data(), width = 0.2, height = input$width, size = 2)} +
{if(ncol(data()) >= 3)geom_tile(aes(x = data()[,1], y = 0.125, fill = as.factor(data()[,3])), data(), width = 0.2, height = 0.02, size = 2)} +
{if(ncol(data()) >= 4)geom_tile(aes(x = data()[,1], y = -0.125, fill = as.factor(data()[,4])), data(), width = 0.2, height = 0.02, size = 2)} +
{if(ncol(data()) == 5)geom_tile(aes(x = data()[,1], y = -0.145, fill = as.factor(data()[,5])), data(), width = 0.2, height = 0.02, size = 2)}
scale_y_continuous(breaks = NULL, labels = NULL)
)
})
})
答案 0 :(得分:0)
renderPlot({...})
已处于反应状态。您可以放下PLOT <-reactive({
和print(
,然后直接进入ggplot()
总的来说,我想我会做这样的事情:
output$graph <- renderPlot({
df <- data()
names(df) <- paste0("v", 1:length(df))
# initial plot
p <-
ggplot(df, aes(x = v1)) +
scale_y_continuous(breaks = NULL, labels = NULL)
# conditions
if (ncol(df) >= 2) {
p <- p + geom_tile(aes(y = 0, fill = as.factor(v2), width = 0.2, height = input$width, size = 2)
}
if (ncol(df) >= 3) {
p <- p + geom_tile(aes(y = 0.125, fill = as.factor(v3), width = 0.2, height = 0.02, size = 2)
}
etc...
# return
p
})
答案 1 :(得分:0)
所以,我终于找到了错误。问题是scale_y_continuous
自动将y轴缩放为绘图元素的大小。就我而言,如果我添加了固定大小的绘图元素(如果数据包含多个列,则由程序完成),也不会出现,这也对y轴的大小设置了限制。在我这种情况下,解决方案是改为使用ylim(-0.2005, 0.2005)
,从而固定y轴大小。