"An error has occurred! In argument: `VLT = scales::percent(as.numeric(VLT))`.

I am new at R programming and last week I was able to run the files written by previous programmer and databases with no issues. Now it won't run and gives me this error. Could anyone help? I tried making a reprex file but have not been able to figure it out. I hope this was enough to help... I do have copy of the file and databases on GitHub, MelissaATIO

UPDATE: Since I'm a new user, it wouldn't let me upload the ERROR image. I'm sure the topic is obvious.

It is much better to upload both code and error messages as text.

Simply copy the code and paste it between
```

```

Do the same for the error messages.

From the screenshot, it looks like you do not have a variable VLT ( or possible you can not do a direct conversion into numeric?).

Try

names(andau_data)

and check that you actually have that variable.

If possible it probably would help us if we had some sample data. handy way to supply some sample data is the dput() function. In the case of a large dataset something like dput(head(mydata, 100)) should supply the data we need. Just do dput(mydata) where mydata is your data. Copy the output and paste it here between
```

```

For general information you may find this useful FAQ Asking Questions.

If possible it woul

Hi! Thanks so much for responding and i apologize for not doing the dput because i'm still learning R! I did however copy/paste a little bit of data here.

Thank you for looking! I'm currently watching a two hour R tutorial by FreeCodeCamp.org on youtube. I hope that'll help me. It has been over 20 years since I've done some coding. :slight_smile:

#
# This is the server logic of a Shiny web application. You can run the
# application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
#
#    http://shiny.rstudio.com/
#

library(shiny)
library(tidyverse)

# Load Andau loupe data
andau_data <- readxl::read_excel("andau_loupe_data.xlsx")

# Load dental data

dental_data <- readxl::read_excel("Dental_data.xlsx")%>%
  filter(`Laser Mfg` != "") %>%
  mutate(VLT = scales::percent(as.numeric(VLT)))


shinyServer(function(input, output, session) {
  observeEvent(input$mfg,{
    # filter dental data to select mfg
    mfg_filtered_dental_data <- dental_data %>% 
      filter(`Laser Mfg` == input$mfg)
    # update select input - laser model
    updateSelectInput(inputId = "mod",
                      choices = sort(mfg_filtered_dental_data$`Laser Model`))
  })

  
  loupe_insert <- eventReactive(input$loupestyle,{
    andau_data %>% 
      filter(`Andau Frame` == input$loupestyle)
  })
  selected_data <- eventReactive(input$mod,{
    req(input$mfg)
    dental_data %>% 
      filter(`Laser Mfg` == input$mfg,
             `Laser Model` == input$mod)
  })
  user_info <- eventReactive(input$run,{
    tibble(
    "Andau Loupe Style" = loupe_insert()$`Andau Frame`,
    "Laser Information" = glue::glue_safe(selected_data()$`Laser Mfg`, " ", selected_data()$`Laser Model`),
    "Laser Specifications" = selected_data()$Wavelengths)
  })
  output$userInfo <- renderTable(bordered = T,
                                  align = "l",
                                  striped=T,
                                  {
                                    user_info()
                                  })
  table_info <- eventReactive(input$run,{
    tibble("INVO Part Number" = if_else(selected_data()$`Eyewear Lens Compatible` == "GP30",
                                                     glue::glue_safe(loupe_insert()$`Innovative Optics Insert`,"." , selected_data()$`Eyewear Lens Compatible`),
                                                     glue::glue_safe(loupe_insert()$`Innovative Optics Insert`,"." , selected_data()$`Eyewear Lens Compatible`, ".2B")),
           "Optical Density Specifications" = selected_data()$`Optical Density`,
           "Visible Light Transmission" = selected_data()$VLT)
  })
  
  output$tableInfo <- renderTable(bordered = T,
                                  align = "l",
                                  striped=T,
                                  height="100%",
                                  {
    table_info()
  })
  rec1_table <- eventReactive(input$run,{
    tibble("INVO Part Number" = selected_data()$`Rec1`)
  })
  output$tableRec1 <- renderTable(bordered = T,
                                  align = "l",
                                  striped=T,
                                  {
                                    rec1_table()
                                  })
  rec2_table <- eventReactive(input$run,{
    tibble("INVO Part Number" = selected_data()$`Rec2`)
  })
  output$tableRec2 <- renderTable(bordered = T,
                                  align = "l",
                                  striped=T,
                                  {
                                    rec2_table()
                                  })
  rec3_table <- eventReactive(input$run,{
    tibble("INVO Part Number" = selected_data()$`Rec3`)
  })
  output$tableRec3 <- renderTable(bordered = T,
                                  align = "l",
                                  striped=T,
                                  {
                                    rec3_table()
                                  })
  image_location <- eventReactive(input$run,{
    c(if_else(input$loupestyle == "Bolle" | input$loupestyle == "Jazz", 
            glue::glue_safe("www/", input$loupestyle, "/", selected_data()$`Eyewear Lens Compatible`, ".jpg"),
            if_else(input$loupestyle == "MOS" & selected_data()$`Eyewear Lens Compatible` == "Pi1",
            glue::glue_safe("www/", input$loupestyle, "/", selected_data()$`Eyewear Lens Compatible`, ".jpg"),        
            glue::glue_safe("www/", input$loupestyle, "/", selected_data()$`Eyewear Lens Compatible`, ".JPG"))),
            if_else(selected_data()$`Eyewear Lens Compatible` == "Pi19",
                    glue::glue_safe("www/recs/", selected_data()$`Rec1`, ".jpeg"),
                    glue::glue_safe("www/recs/", selected_data()$`Rec1`, ".jpg")
                    ),
            if_else(selected_data()$`Eyewear Lens Compatible` == "Pi19",
                    glue::glue_safe("www/recs/", selected_data()$`Rec1`, ".jpeg"),
                    glue::glue_safe("www/recs/", selected_data()$`Rec2`, ".jpg")
                    ),
            glue::glue_safe("www/recs/", selected_data()$`Rec3`, ".jpg"))
  })
  output$productImage <- renderImage({
    req(input$loupestyle)
    req(input$mfg)
    req(input$mod)
    list(src = image_location()[[1]],
         width = "500px",
         contentType = "image/jpeg")
  }
  ,deleteFile = FALSE)
  
  output$rec1 <- renderImage({
    req(input$loupestyle)
    req(input$mfg)
    req(input$mod)
    list(src = image_location()[[2]],
         height = "300px",
         contentType = "image/jpeg")
  }
  ,deleteFile = FALSE)
  
  output$rec2 <- renderImage({
    req(input$loupestyle)
    req(input$mfg)
    req(input$mod)
    list(src = image_location()[[3]],
         height = "300px",
         contentType = "image/jpeg")
  }
  ,deleteFile = FALSE)
  
  output$rec3 <- renderImage({
    req(input$loupestyle)
    req(input$mfg)
    req(input$mod)
    list(src = image_location()[[4]],
         height = "300px",
         contentType = "image/jpeg")
  }
  ,deleteFile = FALSE)

})

=> shiny::runApp()

Loading required package: shiny

Listening on http://127.0.0.1:7838
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
:heavy_check_mark: dplyr 1.1.4 :heavy_check_mark: readr 2.1.5
:heavy_check_mark: forcats 1.0.0 :heavy_check_mark: stringr 1.5.1
:heavy_check_mark: ggplot2 3.5.1 :heavy_check_mark: tibble 3.2.1
:heavy_check_mark: lubridate 1.9.3 :heavy_check_mark: tidyr 1.3.1
:heavy_check_mark: purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
:heavy_multiplication_x: dplyr::filter() masks stats::filter()
:heavy_multiplication_x: dplyr::lag() masks stats::lag()
:information_source: Use the conflicted package to force all conflicts to become errors

Attaching package: 'bslib'

The following object is masked from 'package:utils':

page

Warning: Error in mutate: :information_source: In argument: VLT = scales::percent(as.numeric(VLT)).
Caused by error:
! object 'VLT' not found
77:
76: signalCondition
75: signal_abort
74: abort
73: h
72: .handleSimpleError
71: number
70: scales::percent
69: eval
68: mask$eval_all_mutate
67: mutate_col
65: mutate_cols
64: mutate.data.frame
63: mutate
62: %>%
1: shiny::runApp

Shiny application successfully stopped.

DATA for andau_loupe_data
Andau Frame Innovative Optics Insert

1 Blues LG IVL.R
2 Blues MD IVL.R
3 Bolle IVR
4 Indie LG IVL.R
5 Indie MD IVL.R
6 Jazz IVR
7 MOS IVL.R
8 MOS-W IVL.R
9 ProGear IVL
10 Soul LG IVL.R
11 Soul MD IVL.R

DATA for dental_data
Laser Mfg Laser Model Wavelengths Lens

1 Biolase Waterlase iPlus 2780nm Gi1
2 Biolase Waterlase Express 2780nm Gi1
3 DeKa SmartPerio 1064nm Gi1
4 Fotona LightWalker AT 1064nm / 2940nm Gi1
5 Fotona LightWalker AT S 1064nm / 2940nm Gi1
6 Fotona Lightwalker ST-E 2940nm Gi1
7 Fotona SkyPulse Endo 2940nm Gi1
8 Fotona SkyPulse Versa 2940nm Gi1
9 Fotona NightLase 2940nm Gi1
10 Millennium PerioLase MVP-7 1064nm Gi1
11 Denmat NVPro3 808nm (OD 4) Pi1
12 AMD Picasso+ 800-820nm OD 5 Pi1
13 AMD Picasso+ Lite 800-820nm OD 5 Pi1
14 AMD Clarion 800-820nm OD 5 Pi1
15 AMD Picasso Clario 810nm Pi1
16 Brasseler BLU Dental Microlaser 810nm Pi1

I cannot see any variable (i.e. column name) VLT in dental_data. Nor in andau_data for that matter.

Therefore, this cannot work.

 mutate(VLT = scales::percent(as.numeric(VLT)))

Please use dput() to supply data. Your data is usable but it takes a lot of finagling to get in into R.

Just do

dput(andau_data) 

copy the output and paste it between

```

```

Repeat with *dental.data *

IF a dataset is too large do
```
dput(head(dental.data, 100)
```

which will give us the first hundred rows of *dental.data *.

Here, with a few column name adjustments are your two example datasets in dput() format

andau_data <- structure(list(V1 = c("frame,insert", "Blues LG,IVL.R", "Blues MD,IVL.R", 
"Bolle,IVR", "Indie LG,IVL.R", "Indie MD,IVL.R", "Jazz,IVR", 
"MOS,IVL.R", "MOS-W,IVL.R", "ProGear,IVL", "1Soul LG,IVL.R", 
"Soul MD,IVL.R")), class = "data.frame", row.names = c(NA, -12L
))

dental.data <- structure(list(Laser = c("Biolase", "Biolase", "DeKa", "Fotona", 
"Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Millennium", 
"Denmat", "AMD", "AMD", "AMD", "AMD", "Brasseler"), MfgLaserModel = c("Waterlase iPlus", 
"Waterlase Express", "SmartPerio", "LightWalker AT", "LightWalker AT S", 
"Lightwalker ST-E", "SkyPulse Endo", "SkyPulse Versa", "NightLase", 
"PerioLase MVP-7", "NVPro3", "Picasso+", "Picasso+ Lite", "Clarion", 
"Picasso Clario", "BLU Dental Microlaser"), Wavelengths = c("2780nm", 
"2780nm", "1064nm", "1064nm / 2940nm", "1064nm / 2940nm", "2940nm", 
"2940nm", "2940nm", "2940nm", "1064nm", "808nm (OD 4)", "800-820nm OD 5", 
"800-820nm OD 5", "800-820nm OD 5", "810nm", "810nm"), Lens = c("Gi1", 
"Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", 
"Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1")), class = "data.frame", row.names = c(NA, 
-16L))

You are right! I asked my boss if he recalled having a column named VLT in the database and he said yup. The previous programmer didn't give him the access to the code files, so I think I'm stuck with the old files and I'm doing my best to get it fixed, hopefully the best version! I appreciate all the help while trying to learn at the same time. :slight_smile:

Alright, here's the output...

andau_data

=> shiny::runApp()

Loading required package: shiny

Listening on http://127.0.0.1:4860
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package to force all conflicts to become errors

Attaching package: 'bslib'

The following object is masked from 'package:utils':

    page

structure(list(`Andau Frame` = c("Bolle", "ProGear", "MOS", "MOS-W", 
"Blues LG", "Blues MD", "Indie LG", "Indie MD", "Soul LG", "Soul MD", 
"Jazz"), `Innovative Optics Insert` = c("IVR", "IVL", "IVL.R", 
"IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", 
"IVR")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-11L))
structure(list(`Laser Mfg` = c("Biolase", "Biolase", "DeKa", 
"Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Millennium", 
"Denmat", "AMD", "AMD", "AMD", "AMD", "Brasseler", "CAO", "Clincians Choice", 
"Denmat", "THOR", "THOR", "THOR", "Zolar", "Biolase", "Biolase", 
"Biolase", "King Medical", "Sirona Dentsply", "Sirona Dentsply", 
"Ultradent", "Zolar", "Ivoclar Vivadent", "Convergent Dental", 
"DeKa", "DeKa", "GPT Dental", "Lightscalpel", "Lightscalpel", 
"Zap Lasers"), `Laser Model` = c("Waterlase iPlus", "Waterlase Express", 
"SmartPerio ", "LightWalker AT", "LightWalker AT S", "Lightwalker ST-E", 
"SkyPulse Endo", "SkyPulse Versa", "NightLase", "PerioLase MVP-7", 
"NVPro3", "Picasso+", "Picasso+ Lite", "Clarion", "Picasso Clario", 
"BLU Dental Microlaser", "Precise LTM", "Clincians Choice", "Sol", 
"810nm Infra Red Single Laser Dental Probe", "810nm 1W laser cluster (5 x 200mW)", 
"810nm 200mW single laser probe", "Photon dental diode laser", 
"Epic X", "Epic Pro", "Epic Hygiene", "Beamer STL 980", "SiroLaser Advance Plus", 
"Siro Blue", "Gemini Laser", "Photon Plus Dental Diode Laser", 
"Odyssey Diode", "Solea Laser", "Smart US-20D CO2 Laser", "SmartXide Ultraspeed2 CO2 Laser", 
"DENTA CO2", "LS-1005", "LS-2010", "Softlase"), Wavelengths = c("2780nm", 
"2780nm", "1064nm", "1064nm / 2940nm", "1064nm / 2940nm", "2940nm", 
"2940nm", "2940nm", "2940nm", "1064nm", "808nm (OD 4)", "800-820nm OD 5", 
"800-820nm OD 5", "800-820nm OD 5", "810nm", "810nm", "810nm", 
"808nm", "810nm", "810nm OD 3", "810nm OD 4", "810nm OD 3", "810nm", 
"940nm +/- 10nm", "940nm +/- 20nm, 980nm +/- 20nm", "980nm +/- 10nm", 
"980nm", "660nm +/- 5nm, 970nm -10/+15nm", "440-450nm OD5, 655-665nm OD1, 960-985nm OD5", 
"810nm / 980nm", "980nm", "810nm +/- 20nm", "9,300nm", "10,600nm", 
"10,600nm", "10600nm", "10600nm", "10600nm", "630-670nm (OD 0.7), 800-980nm (OD 3.6)"
), Lens = c("Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", 
"Gi1", "Gi1", "Gi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", 
"Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi17", "Pi17", 
"Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi19", 
"Pi19", "Pi19", "Pi19", "Pi19", "Pi19", "Pi17")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -39L))
structure(list(`Andau Frame` = c("Bolle", "ProGear", "MOS", "MOS-W", 
"Blues LG", "Blues MD", "Indie LG", "Indie MD", "Soul LG", "Soul MD", 
"Jazz"), `Innovative Optics Insert` = c("IVR", "IVL", "IVL.R", 
"IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", 
"IVR")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-11L))
structure(list(`Laser Mfg` = c("Biolase", "Biolase", "DeKa", 
"Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Millennium", 
"Denmat", "AMD", "AMD", "AMD", "AMD", "Brasseler", "CAO", "Clincians Choice", 
"Denmat", "THOR", "THOR", "THOR", "Zolar", "Biolase", "Biolase", 
"Biolase", "King Medical", "Sirona Dentsply", "Sirona Dentsply", 
"Ultradent", "Zolar", "Ivoclar Vivadent", "Convergent Dental", 
"DeKa", "DeKa", "GPT Dental", "Lightscalpel", "Lightscalpel", 
"Zap Lasers"), `Laser Model` = c("Waterlase iPlus", "Waterlase Express", 
"SmartPerio ", "LightWalker AT", "LightWalker AT S", "Lightwalker ST-E", 
"SkyPulse Endo", "SkyPulse Versa", "NightLase", "PerioLase MVP-7", 
"NVPro3", "Picasso+", "Picasso+ Lite", "Clarion", "Picasso Clario", 
"BLU Dental Microlaser", "Precise LTM", "Clincians Choice", "Sol", 
"810nm Infra Red Single Laser Dental Probe", "810nm 1W laser cluster (5 x 200mW)", 
"810nm 200mW single laser probe", "Photon dental diode laser", 
"Epic X", "Epic Pro", "Epic Hygiene", "Beamer STL 980", "SiroLaser Advance Plus", 
"Siro Blue", "Gemini Laser", "Photon Plus Dental Diode Laser", 
"Odyssey Diode", "Solea Laser", "Smart US-20D CO2 Laser", "SmartXide Ultraspeed2 CO2 Laser", 
"DENTA CO2", "LS-1005", "LS-2010", "Softlase"), Wavelengths = c("2780nm", 
"2780nm", "1064nm", "1064nm / 2940nm", "1064nm / 2940nm", "2940nm", 
"2940nm", "2940nm", "2940nm", "1064nm", "808nm (OD 4)", "800-820nm OD 5", 
"800-820nm OD 5", "800-820nm OD 5", "810nm", "810nm", "810nm", 
"808nm", "810nm", "810nm OD 3", "810nm OD 4", "810nm OD 3", "810nm", 
"940nm +/- 10nm", "940nm +/- 20nm, 980nm +/- 20nm", "980nm +/- 10nm", 
"980nm", "660nm +/- 5nm, 970nm -10/+15nm", "440-450nm OD5, 655-665nm OD1, 960-985nm OD5", 
"810nm / 980nm", "980nm", "810nm +/- 20nm", "9,300nm", "10,600nm", 
"10,600nm", "10600nm", "10600nm", "10600nm", "630-670nm (OD 0.7), 800-980nm (OD 3.6)"
), Lens = c("Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", 
"Gi1", "Gi1", "Gi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", 
"Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi17", "Pi17", 
"Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi19", 
"Pi19", "Pi19", "Pi19", "Pi19", "Pi19", "Pi17")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -39L))

dental_data

=> shiny::runApp()

Loading required package: shiny

Listening on http://127.0.0.1:7544
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package to force all conflicts to become errors
structure(list(`Andau Frame` = c("Bolle", "ProGear", "MOS", "MOS-W", 
"Blues LG", "Blues MD", "Indie LG", "Indie MD", "Soul LG", "Soul MD", 
"Jazz"), `Innovative Optics Insert` = c("IVR", "IVL", "IVL.R", 
"IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", "IVL.R", 
"IVR")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-11L))
structure(list(`Laser Mfg` = c("Biolase", "Biolase", "DeKa", 
"Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Millennium", 
"Denmat", "AMD", "AMD", "AMD", "AMD", "Brasseler", "CAO", "Clincians Choice", 
"Denmat", "THOR", "THOR", "THOR", "Zolar", "Biolase", "Biolase", 
"Biolase", "King Medical", "Sirona Dentsply", "Sirona Dentsply", 
"Ultradent", "Zolar", "Ivoclar Vivadent", "Convergent Dental", 
"DeKa", "DeKa", "GPT Dental", "Lightscalpel", "Lightscalpel", 
"Zap Lasers"), `Laser Model` = c("Waterlase iPlus", "Waterlase Express", 
"SmartPerio ", "LightWalker AT", "LightWalker AT S", "Lightwalker ST-E", 
"SkyPulse Endo", "SkyPulse Versa", "NightLase", "PerioLase MVP-7", 
"NVPro3", "Picasso+", "Picasso+ Lite", "Clarion", "Picasso Clario", 
"BLU Dental Microlaser", "Precise LTM", "Clincians Choice", "Sol", 
"810nm Infra Red Single Laser Dental Probe", "810nm 1W laser cluster (5 x 200mW)", 
"810nm 200mW single laser probe", "Photon dental diode laser", 
"Epic X", "Epic Pro", "Epic Hygiene", "Beamer STL 980", "SiroLaser Advance Plus", 
"Siro Blue", "Gemini Laser", "Photon Plus Dental Diode Laser", 
"Odyssey Diode", "Solea Laser", "Smart US-20D CO2 Laser", "SmartXide Ultraspeed2 CO2 Laser", 
"DENTA CO2", "LS-1005", "LS-2010", "Softlase"), Wavelengths = c("2780nm", 
"2780nm", "1064nm", "1064nm / 2940nm", "1064nm / 2940nm", "2940nm", 
"2940nm", "2940nm", "2940nm", "1064nm", "808nm (OD 4)", "800-820nm OD 5", 
"800-820nm OD 5", "800-820nm OD 5", "810nm", "810nm", "810nm", 
"808nm", "810nm", "810nm OD 3", "810nm OD 4", "810nm OD 3", "810nm", 
"940nm +/- 10nm", "940nm +/- 20nm, 980nm +/- 20nm", "980nm +/- 10nm", 
"980nm", "660nm +/- 5nm, 970nm -10/+15nm", "440-450nm OD5, 655-665nm OD1, 960-985nm OD5", 
"810nm / 980nm", "980nm", "810nm +/- 20nm", "9,300nm", "10,600nm", 
"10,600nm", "10600nm", "10600nm", "10600nm", "630-670nm (OD 0.7), 800-980nm (OD 3.6)"
), Lens = c("Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", 
"Gi1", "Gi1", "Gi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", 
"Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi17", "Pi17", 
"Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi19", 
"Pi19", "Pi19", "Pi19", "Pi19", "Pi19", "Pi17")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -39L))

Attaching package: 'bslib'

The following object is masked from 'package:utils':

    page

structure(list(`Laser Mfg` = c("Biolase", "Biolase", "DeKa", 
"Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Fotona", "Millennium", 
"Denmat", "AMD", "AMD", "AMD", "AMD", "Brasseler", "CAO", "Clincians Choice", 
"Denmat", "THOR", "THOR", "THOR", "Zolar", "Biolase", "Biolase", 
"Biolase", "King Medical", "Sirona Dentsply", "Sirona Dentsply", 
"Ultradent", "Zolar", "Ivoclar Vivadent", "Convergent Dental", 
"DeKa", "DeKa", "GPT Dental", "Lightscalpel", "Lightscalpel", 
"Zap Lasers"), `Laser Model` = c("Waterlase iPlus", "Waterlase Express", 
"SmartPerio ", "LightWalker AT", "LightWalker AT S", "Lightwalker ST-E", 
"SkyPulse Endo", "SkyPulse Versa", "NightLase", "PerioLase MVP-7", 
"NVPro3", "Picasso+", "Picasso+ Lite", "Clarion", "Picasso Clario", 
"BLU Dental Microlaser", "Precise LTM", "Clincians Choice", "Sol", 
"810nm Infra Red Single Laser Dental Probe", "810nm 1W laser cluster (5 x 200mW)", 
"810nm 200mW single laser probe", "Photon dental diode laser", 
"Epic X", "Epic Pro", "Epic Hygiene", "Beamer STL 980", "SiroLaser Advance Plus", 
"Siro Blue", "Gemini Laser", "Photon Plus Dental Diode Laser", 
"Odyssey Diode", "Solea Laser", "Smart US-20D CO2 Laser", "SmartXide Ultraspeed2 CO2 Laser", 
"DENTA CO2", "LS-1005", "LS-2010", "Softlase"), Wavelengths = c("2780nm", 
"2780nm", "1064nm", "1064nm / 2940nm", "1064nm / 2940nm", "2940nm", 
"2940nm", "2940nm", "2940nm", "1064nm", "808nm (OD 4)", "800-820nm OD 5", 
"800-820nm OD 5", "800-820nm OD 5", "810nm", "810nm", "810nm", 
"808nm", "810nm", "810nm OD 3", "810nm OD 4", "810nm OD 3", "810nm", 
"940nm +/- 10nm", "940nm +/- 20nm, 980nm +/- 20nm", "980nm +/- 10nm", 
"980nm", "660nm +/- 5nm, 970nm -10/+15nm", "440-450nm OD5, 655-665nm OD1, 960-985nm OD5", 
"810nm / 980nm", "980nm", "810nm +/- 20nm", "9,300nm", "10,600nm", 
"10,600nm", "10600nm", "10600nm", "10600nm", "630-670nm (OD 0.7), 800-980nm (OD 3.6)"
), Lens = c("Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", "Gi1", 
"Gi1", "Gi1", "Gi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", 
"Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi1", "Pi17", "Pi17", 
"Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi17", "Pi19", 
"Pi19", "Pi19", "Pi19", "Pi19", "Pi19", "Pi17")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -39L))

The data came through nicely. Thanks.

If I look at this

dental_data <- readxl::read_excel("Dental_data.xlsx")%>%
  filter(`Laser Mfg` != "") %>%
  mutate(VLT = scales::percent(as.numeric(VLT)))

it looks like VLT should be a character variable in the .xlsx file. Technically, I do not think that it must be in that file but but that code definitely suggests that it is.

Is there any chance that there are older backups of "Dental_data.xlsx" around that might give you some idea of what that variable is?

I am not a {shiny} user so I really cannot follow what is happening but I do see that VLT is called once so it is needed. On the other hand, if I load "andau_data" without running trying to create "VLT" I do not get an error. My guess is that this code is creating a function and we would not run into a problem until we ran the function

I'm sorry not to be of more help but I think your best bet is to look for old backups or any documentation that the original programmer may have written.