С вашим кодом довольно много проблем.Ваш вопрос о $ operator is invalid for atomic vectors
.Действительно, это вызвано вашим методом выбора.Сначала вы выбираете вектор из вашего data.frame, а затем снова пытаетесь заменить этот вектор на имя, которое он имел в data.frame.
Обычно вы пытаетесь применить один и тот же выбор дважды.Легко исправить, пропустив имя столбца при первом выборе:
data_available=df.physical[df.physical$Sport == input$sport, ]
Кроме того, я не уверен, почему вы используете htmlOutput
в сочетании с renderUI
.Если вы хотите обновить / ограничить ваш выбор в selectInput
, вы можете просто использовать функцию updateSelectInput
в сочетании с ObserveEvent
.Это делает ваше приложение более читабельным и менее подверженным ошибкам.
Рабочий пример:
library(shiny)
library(ggplot2)
ui<- fluidPage(
titlePanel("Distribution of Height/Weight for Each Sport"),
sidebarLayout(
sidebarPanel(
helpText("Create a scatter plot of height/weight for every sport in the
Olympics."),
selectInput("sport_selector", choices=c(''), label='Sport:'),
selectInput("year_selector", choices=c(''), label='Year:'),
selectInput("sex_selector", choices=c(''), label='Sex:')
)
,
mainPanel(
plotOutput("olympicphysical"))
)
)
server<-shinyServer(function(input,output, session){
df.physical = data.frame(Height=c(170,180),Weight=c(80,80),Sex=c('M','F'), Year=c(1992,2012), Sport=c('Basketball', 'Judo'))
updateSelectInput(session, 'sport_selector', choices = unique(df.physical$Sport))
observeEvent(input$sport_selector, {
df.physical_subset = subset(df.physical, Sport == input$sport_selector)
updateSelectInput(session, 'year_selector', choices = unique(df.physical_subset$Year))
})
observeEvent({input$year_selector}, {
df.physical_subset = subset(df.physical, Sport == input$sport_selector & Year == input$year_selector)
updateSelectInput(session, 'sex_selector', choices = unique(df.physical_subset$Sex))
})
observeEvent({input$sex_selector},{
df.physical_subset <- subset(df.physical, Sport == input$sport_selector & Year == input$year_selector & Sex==input$sex_selector)
print(df.physical_subset)
output$olympicphysical = renderPlot({
ggplot(df.physical_subset,aes(x=df.physical_subset$Height,y=df.physical_subset$Weight)
)+ geom_point()+theme_classic()+labs(x="Height",y="Weight")})
})
})
shinyApp(ui = ui, server = server)