Brilhante: $ operador é inválido para vetores atômicos

votos
1

Estou tentando mostrar um gráfico de dispersão com brilhante que envolve dados de filtragem através de cliques do usuário. No entanto, eu recebo um erro:

Aviso: Erro em $: $ operador é inválido para vetores atômicos [Nenhum traço de pilha disponível]

Aviso: Erro no renderUI: 객체 'data_available'cannot ser encontrados [Nenhum traço de pilha disponível]

Eu não tenho nenhuma idéia de onde as coisas deram errado. Abaixo está o meu código para meu aplicativo brilhante:

library(shiny)
library(ggplot2)
library(dplyr)

data_events <- read.csv(Desktop/athlete_events.csv)
df.physical <-data_events %>% select(Height,Weight,Sex,Year,Sport) %>% 
filter(!is.na(Height),!is.na(Weight))
df.physical <-as.data.frame(df.physical)

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.),

  htmlOutput(sport_selector),
  htmlOutput(year_selector),
  htmlOutput(sex_selector)

)
,
mainPanel(
  plotOutput(olmypicphysical))
  )
)
server=shinyServer(function(input,output){
  output$sport_selector = renderUI({
    selectInput(inputId=sport, label= Sport:, 
choices=as.character(unique(df.physical$Sport))
    )})
  output$year_selector = renderUI({
    data_available=df.physical[df.physical$Sport == input$sport, Year]
    selectInput(inputId = year, label=Year:, 
choices=unique(data_available$Year))
  })
  output$sex_selector = renderUI({
    data_available1=data_available[data_available$Year == input$year, Sex]
    selectInput(inputId = Sex,label=Sex:, 
choices=unique(data_available1$Sex))
    data_available2=data_available1[data_available1$Sex ==input$sex, 
Physical]
    output$olympicphysical = renderPlot({ 
ggplot(data_available2,aes(x=data_available2$Height,y=data_available2$Weight)
)+ geom_point()+theme_classic()+labs(x=Height,y=Weight)
    })
  })
})
shinyApp(ui = ui, server = server)

O conjunto de dados que eu criei, df.physical (tipo é lista) se parece com isso:

df.physical

Por favor alguém pode me ajudar?

Publicado 27/11/2018 em 18:10
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Há completamente alguns problemas com o seu código. A sua pergunta é sobre $ operator is invalid for atomic vectors. Na verdade, isso é causado por seu método de seleção. Primeiro você selecionar um vetor fora de seu data.frame e ao lado você tentar subconjunto que vector novamente pelo nome que tinha no data.frame.

Basicamente você tenta aplicar a mesma seleção duas vezes. reparo fácil é deixar de fora o nome da coluna na primeira seleção:

data_available=df.physical[df.physical$Sport == input$sport, ]

Além disso, eu não tenho certeza por que você está usando htmlOutputem combinação com renderUI. Se você deseja atualizar / limitar as suas opções em um selectInputvocê pode apenas usar a função updateSelectInputem combinação com ObserveEvent. Isso faz com que a sua aplicação mais legível e menos propenso a erros.

Exemplo de trabalho:

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)
Respondeu 29/11/2018 em 09:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more