r-lib / scales

Tools for ggplot2 scales
https://scales.r-lib.org
Other
404 stars 108 forks source link

`label_number` error when including `scale_cut` argument #413

Closed cb12991 closed 1 week ago

cb12991 commented 11 months ago

Error occurs when supplying scale_cut argument && number input actually cut (i.e., 1,000 -> 1K).

For example, no error thrown when number input does not need cutting:

scales::label_number(scale_cut = scales::cut_short_scale())(mtcars$mpg) 
#>  [1] "21.0" "21.0" "22.8" "21.4" "18.7" "18.1" "14.3" "24.4" "22.8" "19.2"
#> [11] "17.8" "16.4" "17.3" "15.2" "10.4" "10.4" "14.7" "32.4" "30.4" "33.9"
#> [21] "21.5" "15.5" "15.2" "13.3" "19.2" "27.3" "26.0" "30.4" "15.8" "19.7"
#> [31] "15.0" "21.4"

Error thrown when number input requires cutting:

scales::label_number(scale_cut = scales::cut_short_scale())(mtcars$mpg^2)
#> Error in break_suffix[bad_break][improved_break & !power10_break] <- names(lower_break[improved_break & : NAs are not allowed in subscripted assignments

Created on 2023-11-29 with reprex v2.0.2

cgoo4 commented 11 months ago

I was just about to post the same issue. Adding reprex here in case it helps:

library(tidyverse)
library(scales)

# Error
tibble(x = seq(1, 10, 1),
       y = seq(10, 9010, 1000)) |> 
  ggplot(aes(x, y)) +
  geom_line() +
  scale_y_continuous(labels = label_currency(scale_cut = cut_short_scale()))
#> Error in break_suffix[bad_break][improved_break & !power10_break] <- names(lower_break[improved_break & : NAs are not allowed in subscripted assignments

# Work Okay
tibble(x = seq(0, 10, 1),
       y = 10 ^ (0:10)) |> 
  ggplot(aes(x, y)) +
  geom_line() +
  scale_y_log10(labels = label_currency(scale_cut = cut_short_scale()))


tibble(x = seq(0, 10, 1),
       y = 10 ^ (0:10)) |> 
  ggplot(aes(x, y)) +
  geom_line() +
  scale_y_continuous(labels = label_currency(scale_cut = cut_short_scale()))


tibble(x = seq(1, 10, 1),
       y = seq(10, 9010, 1000)) |> 
  ggplot(aes(x, y)) +
  geom_line() +
  scale_y_log10(labels = label_currency(scale_cut = cut_short_scale()))

Created on 2023-12-03 with reprex v2.0.2

Session info ``` r sessioninfo::session_info() #> ─ Session info ─────────────────────────────────────────────────────────────── #> setting value #> version R version 4.3.2 (2023-10-31) #> os macOS Sonoma 14.1.2 #> system aarch64, darwin20 #> ui X11 #> language (EN) #> collate en_US.UTF-8 #> ctype en_US.UTF-8 #> tz Europe/London #> date 2023-12-03 #> pandoc 3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown) #> #> ─ Packages ─────────────────────────────────────────────────────────────────── #> package * version date (UTC) lib source #> cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0) #> colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0) #> curl 5.1.0 2023-10-02 [2] CRAN (R 4.3.1) #> digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0) #> dplyr * 1.1.4 2023-11-17 [1] CRAN (R 4.3.1) #> evaluate 0.23 2023-11-01 [2] CRAN (R 4.3.1) #> fansi 1.0.5 2023-10-08 [1] CRAN (R 4.3.1) #> farver 2.1.1 2022-07-06 [1] CRAN (R 4.3.0) #> fastmap 1.1.1 2023-02-24 [2] CRAN (R 4.3.0) #> forcats * 1.0.0 2023-01-29 [2] CRAN (R 4.3.0) #> fs 1.6.3 2023-07-20 [2] CRAN (R 4.3.0) #> generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0) #> ggplot2 * 3.4.4 2023-10-12 [1] CRAN (R 4.3.1) #> glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0) #> gtable 0.3.4 2023-08-21 [1] CRAN (R 4.3.0) #> highr 0.10 2022-12-22 [2] CRAN (R 4.3.0) #> hms 1.1.3 2023-03-21 [2] CRAN (R 4.3.0) #> htmltools 0.5.7 2023-11-03 [2] CRAN (R 4.3.1) #> knitr 1.45 2023-10-30 [2] CRAN (R 4.3.1) #> labeling 0.4.3 2023-08-29 [1] CRAN (R 4.3.0) #> lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.3.1) #> lubridate * 1.9.3 2023-09-27 [1] CRAN (R 4.3.1) #> magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0) #> munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0) #> pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0) #> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0) #> purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0) #> R.cache 0.16.0 2022-07-21 [2] CRAN (R 4.3.0) #> R.methodsS3 1.8.2 2022-06-13 [2] CRAN (R 4.3.0) #> R.oo 1.25.0 2022-06-12 [2] CRAN (R 4.3.0) #> R.utils 2.12.3 2023-11-18 [2] CRAN (R 4.3.1) #> R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0) #> readr * 2.1.4 2023-02-10 [2] CRAN (R 4.3.0) #> reprex 2.0.2 2022-08-17 [2] CRAN (R 4.3.0) #> rlang 1.1.2 2023-11-04 [1] CRAN (R 4.3.1) #> rmarkdown 2.25 2023-09-18 [2] CRAN (R 4.3.1) #> rstudioapi 0.15.0 2023-07-07 [2] CRAN (R 4.3.0) #> scales * 1.3.0 2023-11-28 [1] CRAN (R 4.3.1) #> sessioninfo 1.2.2 2021-12-06 [2] CRAN (R 4.3.0) #> stringi 1.8.2 2023-11-23 [1] CRAN (R 4.3.1) #> stringr * 1.5.1 2023-11-14 [1] CRAN (R 4.3.1) #> styler 1.10.2 2023-08-29 [2] CRAN (R 4.3.0) #> tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0) #> tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0) #> tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0) #> tidyverse * 2.0.0 2023-02-22 [2] CRAN (R 4.3.0) #> timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0) #> tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0) #> utf8 1.2.4 2023-10-22 [1] CRAN (R 4.3.1) #> vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.3.1) #> withr 2.5.2 2023-10-30 [1] CRAN (R 4.3.1) #> xfun 0.41 2023-11-01 [2] CRAN (R 4.3.1) #> xml2 1.3.5 2023-07-06 [2] CRAN (R 4.3.0) #> yaml 2.3.7 2023-01-23 [2] CRAN (R 4.3.0) #> #> [1] /Users/carlgoodwin/Library/R/arm64/4.3/library #> [2] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library #> #> ────────────────────────────────────────────────────────────────────────────── ```
rosssheehy commented 11 months ago

Same issue here, CONFIRMED IT IS SOLVED BY ROLLING BACK TO Scales v1.2.1

Error message

Error in break_suffix[bad_break][improved_break & !power10_break] <- names(lower_break[improved_break & : NAs are not allowed in subscripted assignments

uramith commented 11 months ago

Yeah, Same issue with cut_short_scale. But cut_si works fine. here is an example : Same error as mentioned above

set.seed(123)
expand_grid(date = seq(from = as.Date("2023-12-01")
                  , to = as.Date("2023-12-06")
                  , by = "day")
       , entity = c("A","B","C","D")) %>% 
  mutate(cnts = runif(nrow(.),min = 10, max = 1e4)) %>% 
  ggplot(aes(date, y= cnts, fill = entity, color = entity)) +
  geom_point() +
  geom_line() +
  facet_wrap(entity ~ ., scales = "free") +
  scale_y_continuous(labels = scales::label_number(scale_cut = scales::cut_short_scale()))

With cut_si there is no error!

set.seed(123)
expand_grid(date = seq(from = as.Date("2023-12-01")
                       , to = as.Date("2023-12-06")
                       , by = "day")
            , entity = c("A","B","C","D")) %>% 
  mutate(cnts = runif(nrow(.),min = 10, max = 1e4)) %>% 
  ggplot(aes(date, y= cnts, fill = entity, color = entity)) +
  geom_point() +
  geom_line() +
  facet_wrap(entity ~ ., scales = "free") +
  scale_y_continuous(labels = scales::label_number(scale_cut = scales::cut_si(""))) 
Filebb commented 10 months ago

Same issue with other data, and I confirm that rolling back to 1.2.1 solves the problem

msgoussi commented 10 months ago

How to roll back to Scales v1.2.1? why they do not keep an archive of old versions ?

Filebb commented 10 months ago

@msgoussi I used this post as guidance

https://www.r-bloggers.com/2021/01/installing-older-version-of-a-package/

jbengler commented 10 months ago

Clearly looks like unintended behavior to me.

scales 1.3.0

scales::label_number(scale_cut = scales::cut_short_scale())(c(0,1000,2000))
#> [1] "0"  "1K" "2K"
scales::label_number(scale_cut = scales::cut_short_scale())(c(0,500,1500,2000,2500))
#> Error in break_suffix[bad_break][improved_break & !power10_break] <- names(lower_break[improved_break & : NAs are not allowed in subscripted assignments

scales 1.2.1

scales::label_number(scale_cut = scales::cut_short_scale())(c(0,1000,2000))
#> [1] "0"  "1K" "2K"
scales::label_number(scale_cut = scales::cut_short_scale())(c(0,500,1500,2000,2500))
#> [1] "0"    "500"  "1.5K" "2.0K" "2.5K"

Created on 2023-12-17 with reprex v2.0.2

jbengler commented 10 months ago

Some more thoughts

It seems like the problem comes from this line of code in the function scale_cut

lower_break <- breaks[match(break_suffix[bad_break], names(breaks)) - 1]

In my example above lower_breaks become 0 which causes trouble with division by zero in the following lines.

It might be sufficient to add one more line and make it:

lower_break <- breaks[match(break_suffix[bad_break], names(breaks)) - 1]
lower_break[lower_break == 0] <- 1
ibuiltthis commented 10 months ago

Have encountered the same problem while using ggplot with scale_y_continuous. Have found a workaround that fixed it for me.


library(tidyverse)

# Error in break_suffix[bad_break][improved_break & !power10_break] <- names(lower_break[improved_break &  : 
#   NAs are not allowed in subscripted assignments
tibble(
    x = 1:3,
    y = as.integer(c(12312, 11931, 11185))
) |>
    ggplot() +
    geom_col(
        aes(x = x, y = y),
    ) +
    scale_y_continuous(
        label = scales::label_number(scale_cut = scales::cut_short_scale()),
    )

# Workaround: Adding a 1 between 0 and 1000 in the result of scales_cut_short() fixes the error. 
library(tidyverse)
tibble(
    x = 1:3,
    y = as.integer(c(12312, 11931, 11185))
) |>
    ggplot() +
    geom_col(
        aes(x = x, y = y),
    ) +
    scale_y_continuous(
        label = scales::label_number(scale_cut = append(scales::cut_short_scale(), 1, 1)),
    )
msgoussi commented 8 months ago

Hi.. I am using many packages and i get the error because i am using scales 1.2.1

namespace ‘scales’ 1.2.1 is already loaded, but >= 1.3.0 is required Failed with error: ‘package ‘ggplot2’ could not be loaded’

please advise.

msgoussi commented 8 months ago

I have used devtools::install_github("r-lib/scales", ref = "c0f79d3") and it is working fine

jthomasmock commented 2 months ago

Also running into this with a basic reprex:

scales::label_number(big.mark = ",", scale_cut = scales::cut_long_scale(TRUE))(range(palmerpenguins::penguins$body_mass_g, na.rm = TRUE))
#> Error in break_suffix[bad_break][improved_break & !power10_break] <- names(lower_break[improved_break & : NAs are not allowed in subscripted assignments

scales::label_number(big.mark = ",")(range(palmerpenguins::penguins$body_mass_g, na.rm = TRUE))
#> [1] "2,700" "6,300"

Created on 2024-08-22 with reprex v2.1.0