Eddy Harrity
Eddy Harrity

Reputation: 85

input string 1 is invalid UTF-8 Shiny app

I am trying to create a shiny app and keep gettint the error Warning: Error in sub: input string 1 is invalid UTF-8 that prevents my selectInput from showing up. I have tried using the utf8 package to convert the strings to valid UTF-8 strings and have even tested before running the app to confirm they are all UTF-8 valid mean(utf8_valid(unique(lol_data$name)))[1] 1 and yet the error still occurs. Any help on getting this to work would be much appreciated.

Code For Shiny App This is the code for my app.

setwd("")
library(shiny)
lol_data <- read_csv(paste("data/shiny/cleanedlol_data", 
                           Sys.Date(), sep = ''))

# Define UI for application that draws a histogram
ui <- fluidPage(
  titlePanel("How well will your lol draft do?"),
  sidebarLayout(
   sidebarPanel(
     selectInput(
       "player",
       "select your player *required",
       choices = unique(as.character(lol_data$name))
     ),
     uiOutput("secondSelection"),
     uiOutput("thirdSelection"),
     uiOutput("fourthSelection"),
     uiOutput("fifthSelection")
   ),
   mainPanel(
     plotOutput("histogram")
   )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  output$secondSelection <- renderUI({
    selectInput("opp_name", "select your opponent", 
                choices = unique(lol_data %>%
                                         filter(name == input$player &
                                                  ifelse(!is.na(input$team),
                                                         lol_data$team ==
                                                           input$team,
                                                         !is.na(lol_data$team)) &
                                                  ifelse(!is.na(input$team_vs),
                                                          lol_data$team_vs ==
                                                            input$team_vs, 
                                                          !is.na(team_vs)) &
                                                  ifelse(!is.na(input$role),
                                                         lol_data$role ==
                                                           input$role,
                                                         !is.na(lol_data$role))
                                                         )) %>%
                                       pull(opp_name))
  })
  output$thirdSelection <- renderUI({
    selectInput("team", "select your player's team", 
                choices = unique(lol_data%>%
                                         filter(name == input$player &
                                                  ifelse(!is.na(input$opp_name),
                                                         lol_data$opp_name ==
                                                           input$opp_name,
                                                         !is.na(lol_data$opp_name)) &
                                                         ifelse(!is.na(input$team_vs),
                                                                lol_data$team_vs ==
                                                                  input$team_vs, 
                                                                !is.na(team_vs)) &
                                                         ifelse(!is.na(input$role),
                                                                lol_data$role ==
                                                                  input$role,
                                                                !is.na(lol_data$role))
                                                  )) %>%
                  pull(team))
  })
  output$fourthSelection <- renderUI({
    selectInput("team_vs", "select your opposing team", 
                choices = unique(lol_data%>%
                                         filter(name == input$player&
                                                  ifelse(!is.na(input$opp_name),
                                                         lol_data$opp_name ==
                                                           input$opp_name,
                                                         !is.na(lol_data$opp_name) &
                                                         ifelse(!is.na(input$team),
                                                                lol_data$team ==
                                                                  input$team, 
                                                                !is.na(team)) &
                                                         ifelse(!is.na(input$role),
                                                                lol_data$role ==
                                                                  input$role,
                                                                !is.na(lol_data$role))
                                                  )) %>%
                                         pull(team_vs)))
  })
  output$fifthSelection <- renderUI({
    selectInput("role", "select your player's role", 
                choices = unique(lol_data%>%
                                         filter(name == input$player &
                                                  ifelse(!is.na(input$team),
                                                         lol_data$team ==
                                                           input$team,
                                                         !is.na(lol_data$team)) &
                                                         ifelse(!is.na(input$team_vs),
                                                                lol_data$team_vs ==
                                                                  input$team_vs, 
                                                                !is.na(team_vs)) &
                                                         ifelse(!is.na(input$opp_name),
                                                                lol_data$opp_name ==
                                                                  input$opp_name,
                                                                !is.na(lol_data$opp_name))
                                                  )) %>%
                  pull(role))
  })
  output$hist <- renderPlot({
    data_name <- subset(lol_data, name == input$player, opp_name = input$opp_name,
                        team == input$team, team_vs == input$team_vs,
                        role == input$role)
    ggplot(data_name, aes(x = points))+
      geom_histogram()
  })  
}


shinyApp(ui = ui, server = server)

Result This is the result I get when I test the App.

runApp('~/test')
Warning: Missing column names filled in: 'X1' [1]
Parsed with column specification:
cols(
  .default = col_double(),
  name = col_character(),
  link = col_character(),
  champion = col_character(),
  summoner_spells = col_character(),
  items = col_character(),
  team = col_character(),
  team_vs = col_character(),
  player_win = col_character(),
  date_time_utc = col_datetime(format = ""),
  role = col_character(),
  unique_line = col_character(),
  unique_game = col_character(),
  unique_line_vs = col_character(),
  current_year = col_logical(),
  opp_name = col_character(),
  opp_team = col_character(),
  opp_team_vs = col_character(),
  opp_player_win = col_character(),
  opp_date_time_utc = col_datetime(format = ""),
  opp_role = col_character()
  # ... with 1 more columns
)
See spec(...) for full column specifications.
|=================================================================================================================| 100%  416 MB

Listening on http://127.0.0.1:6931
Warning: Error in sub: input string 1 is invalid UTF-8
  [No stack trace available]

Code for preparing csv file pulled for app This is the relevant code for prepping the data that gives me the error.

library(utf8)
if(str_detect(list.files("data/shiny/"), 
              paste("cleanedlol_data", Sys.Date(),  sep = ""))){
  lol_data <- read_csv(paste("data/shiny/cleanedlol_data", 
                             Sys.Date(), sep = ''))
}else{

lol_data <- lol_data  %>%
  janitor::clean_names() %>%
  mutate(lg_kll_vr_sssts = replace(lg_kll_vr_sssts, 
                                   is.infinite(lg_kll_vr_sssts),NA),
         lg_kll_cs_vr_dth = replace(lg_kll_cs_vr_dth, 
                                    is.infinite(lg_kll_cs_vr_dth),NA),
         lg_kls_sts_cs_vr_dth = replace(lg_kls_sts_cs_vr_dth, 
                                        is.infinite(lg_kls_sts_cs_vr_dth),NA),
         lg_kls_vr_sts_cs = replace(lg_kls_vr_sts_cs, 
                                    is.infinite(lg_kls_vr_sts_cs),NA),
         lg_kl_vr_sts_cs_dth = replace(lg_kl_vr_sts_cs_dth, 
                                       is.infinite(lg_kl_vr_sts_cs_dth),NA),
         hist_points = points) %>%
  arrange(name, date_time_utc) %>%
  group_by(name) %>%
  mutate(avg_points = mean(points, na.rm = TRUE)) %>%
  mutate_at(c("kills", "deaths", "assists", "gold", "cs", "team_kills",
              "team_gold", "hist_points", "lg_kll_vr_sssts",
              "lg_kll_cs_vr_dth", "lg_kls_sts_cs_vr_dth", 
              "lg_kls_vr_sts_cs", "lg_kl_vr_sts_cs_dth"), 
            list(~rollapply(lag(.), 3, 
                            mean, na.rm=T, 
                            partial = F,
                            fill = NA, 
                            align = "right"))) %>%
  ungroup() %>%
  group_by(name, current_year) %>%
  mutate(current_yr_avg_pnts = mean(points, na.rm = TRUE),
         current_yr_avg_kills = mean(kills, na.rm = TRUE),
         current_yr_avg_deaths = mean(deaths, na.rm = TRUE),
         current_yr_avg_assists = mean(assists, na.rm = TRUE),
         current_yr_avg_gold = mean(gold, na.rm = TRUE),
         current_yr_avg_cs = mean(cs, na.rm = TRUE),
         crrnt_yr_avg_lg_kll_vr_sssts = mean(lg_kll_vr_sssts, na.rm = T),
         crnt_yr_avg_lg_kll_cs_vr_dth = mean(lg_kll_cs_vr_dth, na.rm=T),
         crnt_yr_lg_kls_sts_cs_vr_dth = mean(lg_kls_sts_cs_vr_dth, 
                                             na.rm=T),
         crnt_yr_lg_kls_vr_sts_cs = mean(lg_kls_vr_sts_cs, na.rm=T)) %>%
  ungroup() %>%
  select(-trinket, -keystone_mastery, -keystone_rune, -time, -dst, 
         -tournament, -game_id_wiki, -game_id_riot, -time_precision,
         -date_time_utc_precision) %>%
  mutate_if(is.character, as_utf8) %>%
  filter(complete.cases(.))

opp_data <- lol_data %>%
  select(name, kills, deaths, assists, gold, cs, team_kills, team_gold, team, 
         team_vs,  player_win, date_time_utc, role,
         role_number, side, unique_line, unique_line_vs, 
          points,
         hist_points, current_yr_avg_pnts, current_yr_avg_kills , 
         current_yr_avg_deaths ,current_yr_avg_assists , 
         current_yr_avg_gold , current_yr_avg_cs,
         crrnt_yr_avg_lg_kll_vr_sssts, lg_kll_vr_sssts,
         crnt_yr_avg_lg_kll_cs_vr_dth, lg_kll_cs_vr_dth) %>%
  rename(opp_name = name, opp_kills = kills, opp_deaths = deaths, 
         opp_assists =  assists, opp_gold = gold, opp_cs = cs, 
         opp_team_kills = team_kills, opp_team_gold = team_gold, 
         opp_team = team, opp_team_vs = team_vs, 
         opp_player_win = player_win,opp_date_time_utc = date_time_utc, 
         opp_role = role,
         opp_role_number = role_number, opp_side = side, 
         opp_unique_line = unique_line, opp_unique_line_vs = unique_line_vs,
         opp_points = points, 
         opp_hist_points = hist_points, 
         opp_current_yr_avg_pnts = current_yr_avg_pnts, 
         opp_current_yr_avg_kills = current_yr_avg_kills, 
         opp_current_yr_avg_deaths = current_yr_avg_deaths,
         opp_current_yr_avg_assists = current_yr_avg_assists, 
         opp_current_yr_avg_gold = current_yr_avg_gold, 
         opp_current_yr_avg_cs = current_yr_avg_cs,
         opp_crrnt_yr_avg_lg_kll_vr_sssts = crrnt_yr_avg_lg_kll_vr_sssts,
         opp_lg_kll_vr_sssts = lg_kll_vr_sssts,
         opp_crnt_yr_avg_lg_kll_cs_vr_dth = crnt_yr_avg_lg_kll_cs_vr_dth,
         opp_lg_kll_cs_vr_dth = lg_kll_cs_vr_dth)

lol_data <- lol_data %>%
  left_join(opp_data, by = c("unique_line" = "opp_unique_line_vs"))%>%
  filter(complete.cases(.))

write.csv(lol_data, file = paste("data/shiny/cleanedlol_data", 
                                 Sys.Date(), 
                                  sep = ""))

}
beep("fanfare")

Upvotes: 2

Views: 10134

Answers (1)

Eddy Harrity
Eddy Harrity

Reputation: 85

I found a solution that worked,

Using mutate_if(is.character, utf8::utf8_encode) instead of mutate_if(is.character, utf8::as_utf8) when prepping the data worked.

Upvotes: 6

Related Questions