A slightly different approach to what’s currently in ggdims.

library(tidyverse)

dims <- function(...){}


dims_expand2 <- function(select) {

  structure(
    list(), 
    class = "dims_expand2"
    )

}


#' @import ggplot2
#' @importFrom ggplot2 ggplot_add
#' @export
ggplot_add.dims_expand2 <- function(object, plot, object_name) {
  
  # get expression inside of dims parentheses in `aes(dims = dims(var1:var10))`
  # would return "var1:var10"
  select_specs <- plot$mapping$dims[[2]] |> 
    as.character() |> 
    _[-1] |> 
    paste(collapse = ", ")
  
  # from plot data point to the select_specs variables that are specified 
  # and save a data frame, in features_df
  features_df <- paste0("select(plot$data,",  select_specs, ")") |> 
    rlang::parse_expr() |> 
    eval()

  # create a vector added to the plot data
  plot$data$.dims_stasher <- vector("list", nrow(plot$data))

  for (i in 1:nrow(features_df)){
  # store the features data as a 1 row data frame in vector .dims_stasher...
  plot$data$.dims_stasher[[i]] <- features_df[i,]
  }
  
  # overwrite dims mapping to point to new vector that contains features_df
  plot$mapping <- modifyList(plot$mapping, aes(dims = .dims_stasher))
  
  plot
  
}

dims <- function(){}

ggplot(mtcars) + 
  aes(dims = dims(mpg:drat, qsec), x = 1, y = 1) + 
  geom_point() + 
  dims_expand2()
## Warning: Subsetting quosures with `[[` is deprecated as of rlang 0.4.0
## Please use `quo_get_expr()` instead.
## This warning is displayed once every 8 hours.

p <- last_plot()

p$mapping
## Aesthetic mapping: 
## * `x`    -> 1
## * `y`    -> 1
## * `dims` -> `.dims_stasher`
p$data$.dims_stasher[[1]]
##           mpg cyl disp  hp drat  qsec
## Mazda RX4  21   6  160 110  3.9 16.46
p$data$.dims_stasher |>
  bind_rows() |>
  ggdims:::pca_layout()
## # A tibble: 32 × 6
##        PC1     PC2     PC3     PC4     PC5     PC6
##      <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 -0.569   0.849  -0.365   0.381  -0.498  -0.0411
##  2 -0.661   0.622  -0.209   0.326  -0.440  -0.127 
##  3 -1.84   -0.0330  0.0120  0.472   0.120   0.308 
##  4 -0.204  -1.37   -0.366  -0.230   0.0616  0.116 
##  5  1.64   -0.233  -0.432  -0.522  -0.202  -0.0427
##  6 -0.0359 -2.10   -0.360   0.345   0.215   0.0195
##  7  2.56    0.502  -0.0550 -0.0120  0.268   0.110 
##  8 -2.13   -0.913   0.0217  0.0439 -0.0283  0.308 
##  9 -2.46   -1.73    1.35   -0.137   0.468  -0.237 
## 10 -0.645   0.126   0.375   0.349  -0.261  -0.281 
## # ℹ 22 more rows

then a new compute…

compute_pca_rows <- function (data, scales){
  
    data_for_reduction <- data$dims |> bind_rows()

    clean_data <- remove_missing(bind_cols(data_for_reduction,
        data |> select(-"dims")))
    
    # set.seed(1345)
    
    clean_data[names(data_for_reduction)] |>
      ggdims:::pca_layout() |>
      bind_cols(clean_data)
    
}



StatPca <- ggproto("StatPca", Stat, compute_panel = compute_pca_rows,
                   default_aes = 
                             aes(x = after_stat(PC1), 
                                 y = after_stat(PC2)))

ggplot(mtcars) +
  aes(dims = dims(mpg:drat, qsec)) +
  dims_expand2() +
  geom_point(stat = StatPca)

layer_data()
##           PC1         PC2         PC3         PC4         PC5         PC6  mpg
## 1  -0.5685952  0.84898005 -0.36520768  0.38076082 -0.49765844 -0.04111557 21.0
## 2  -0.6609821  0.62175339 -0.20930295  0.32573003 -0.43977398 -0.12688943 21.0
## 3  -1.8354366 -0.03297278  0.01197355  0.47189407  0.12036726  0.30806796 22.8
## 4  -0.2035116 -1.36882397 -0.36607373 -0.23024290  0.06164315  0.11584403 21.4
## 5   1.6428524 -0.23338608 -0.43159980 -0.52167827 -0.20180499 -0.04274421 18.7
## 6  -0.0359078 -2.09857825 -0.35994069  0.34519767  0.21541539  0.01946672 18.1
## 7   2.5582649  0.50191877 -0.05500559 -0.01197871  0.26757152  0.11024182 14.3
## 8  -2.1321425 -0.91254205  0.02171106  0.04392743 -0.02829995  0.30767949 24.4
## 9  -2.4572800 -1.72827882  1.35447822 -0.13663282  0.46765613 -0.23749019 22.8
## 10 -0.6451107  0.12632603  0.37494912  0.34915166 -0.26051488 -0.28073968 19.2
## 11 -0.6423543 -0.15154325  0.64647312  0.45637183 -0.25476871 -0.34574763 17.8
## 12  1.5258791 -0.40808734 -0.37231966  0.15069047  0.05079713 -0.38405946 16.4
## 13  1.4274780 -0.46711763 -0.38380717  0.02420551  0.10764558 -0.43198108 17.3
## 14  1.5141009 -0.68104060 -0.11572183  0.23417039  0.06458228 -0.45290921 15.2
## 15  2.8239402 -1.07633988  0.51932185 -0.18221547 -0.23521811  0.44345481 10.4
## 16  2.8244060 -0.87736173  0.58053185 -0.14117012 -0.14842847  0.38646415 10.4
## 17  2.4507973 -0.26876153  0.45128124 -0.59804782  0.07108473  0.20079134 14.7
## 18 -3.0996416  0.02663848 -0.36155268 -0.62379805  0.22392396 -0.15261733 32.4
## 19 -3.4470042  1.23900134  0.46223782 -0.48536272 -0.59609053 -0.19266536 30.4
## 20 -3.4040638  0.04753944 -0.20569103 -0.84217220  0.25507989 -0.31485052 33.9
## 21 -1.8058452 -0.79513370  0.35970674  0.46197432  0.31572826  0.20305449 21.5
## 22  1.8437259 -0.73453250 -0.87753770  0.22952627 -0.30763207  0.01126956 15.5
## 23  1.4912963 -0.47165399 -0.29833372  0.18776227 -0.46553057 -0.21170149 15.2
## 24  2.3288487  1.23424887  0.49767981  0.05860537 -0.09162956  0.01337071 13.3
## 25  1.7916475 -0.35868651 -0.47429048 -0.76603868 -0.23460828  0.12463206 19.2
## 26 -2.6338865  0.13219938 -0.13910604  0.03608427 -0.04070977  0.03387327 27.3
## 27 -2.0966577  1.43326026 -0.06009128  0.06430236 -0.33401447  0.43426868 26.0
## 28 -1.9748274  0.86103273 -1.06081960 -0.20783205  0.55538981  0.36589228 30.4
## 29  2.1028878  2.28221451  0.72202870 -0.31674187 -0.15112612 -0.05040515 15.8
## 30  0.2197871  1.19524373 -0.60859826  0.67620620  0.29304877  0.05691350 19.7
## 31  2.8502266  1.84017703  0.22910147  0.08959756  1.15191833 -0.16610375 15.0
## 32 -1.7528917  0.27430663  0.51352535  0.47775317  0.06595668  0.29673519 21.4
##    cyl  disp  hp drat  qsec PANEL group          x           y shape colour
## 1    6 160.0 110 3.90 16.46     1    -1 -0.5685952  0.84898005    19  black
## 2    6 160.0 110 3.90 17.02     1    -1 -0.6609821  0.62175339    19  black
## 3    4 108.0  93 3.85 18.61     1    -1 -1.8354366 -0.03297278    19  black
## 4    6 258.0 110 3.08 19.44     1    -1 -0.2035116 -1.36882397    19  black
## 5    8 360.0 175 3.15 17.02     1    -1  1.6428524 -0.23338608    19  black
## 6    6 225.0 105 2.76 20.22     1    -1 -0.0359078 -2.09857825    19  black
## 7    8 360.0 245 3.21 15.84     1    -1  2.5582649  0.50191877    19  black
## 8    4 146.7  62 3.69 20.00     1    -1 -2.1321425 -0.91254205    19  black
## 9    4 140.8  95 3.92 22.90     1    -1 -2.4572800 -1.72827882    19  black
## 10   6 167.6 123 3.92 18.30     1    -1 -0.6451107  0.12632603    19  black
## 11   6 167.6 123 3.92 18.90     1    -1 -0.6423543 -0.15154325    19  black
## 12   8 275.8 180 3.07 17.40     1    -1  1.5258791 -0.40808734    19  black
## 13   8 275.8 180 3.07 17.60     1    -1  1.4274780 -0.46711763    19  black
## 14   8 275.8 180 3.07 18.00     1    -1  1.5141009 -0.68104060    19  black
## 15   8 472.0 205 2.93 17.98     1    -1  2.8239402 -1.07633988    19  black
## 16   8 460.0 215 3.00 17.82     1    -1  2.8244060 -0.87736173    19  black
## 17   8 440.0 230 3.23 17.42     1    -1  2.4507973 -0.26876153    19  black
## 18   4  78.7  66 4.08 19.47     1    -1 -3.0996416  0.02663848    19  black
## 19   4  75.7  52 4.93 18.52     1    -1 -3.4470042  1.23900134    19  black
## 20   4  71.1  65 4.22 19.90     1    -1 -3.4040638  0.04753944    19  black
## 21   4 120.1  97 3.70 20.01     1    -1 -1.8058452 -0.79513370    19  black
## 22   8 318.0 150 2.76 16.87     1    -1  1.8437259 -0.73453250    19  black
## 23   8 304.0 150 3.15 17.30     1    -1  1.4912963 -0.47165399    19  black
## 24   8 350.0 245 3.73 15.41     1    -1  2.3288487  1.23424887    19  black
## 25   8 400.0 175 3.08 17.05     1    -1  1.7916475 -0.35868651    19  black
## 26   4  79.0  66 4.08 18.90     1    -1 -2.6338865  0.13219938    19  black
## 27   4 120.3  91 4.43 16.70     1    -1 -2.0966577  1.43326026    19  black
## 28   4  95.1 113 3.77 16.90     1    -1 -1.9748274  0.86103273    19  black
## 29   8 351.0 264 4.22 14.50     1    -1  2.1028878  2.28221451    19  black
## 30   6 145.0 175 3.62 15.50     1    -1  0.2197871  1.19524373    19  black
## 31   8 301.0 335 3.54 14.60     1    -1  2.8502266  1.84017703    19  black
## 32   4 121.0 109 4.11 18.60     1    -1 -1.7528917  0.27430663    19  black
##    fill size alpha stroke
## 1    NA  1.5    NA    0.5
## 2    NA  1.5    NA    0.5
## 3    NA  1.5    NA    0.5
## 4    NA  1.5    NA    0.5
## 5    NA  1.5    NA    0.5
## 6    NA  1.5    NA    0.5
## 7    NA  1.5    NA    0.5
## 8    NA  1.5    NA    0.5
## 9    NA  1.5    NA    0.5
## 10   NA  1.5    NA    0.5
## 11   NA  1.5    NA    0.5
## 12   NA  1.5    NA    0.5
## 13   NA  1.5    NA    0.5
## 14   NA  1.5    NA    0.5
## 15   NA  1.5    NA    0.5
## 16   NA  1.5    NA    0.5
## 17   NA  1.5    NA    0.5
## 18   NA  1.5    NA    0.5
## 19   NA  1.5    NA    0.5
## 20   NA  1.5    NA    0.5
## 21   NA  1.5    NA    0.5
## 22   NA  1.5    NA    0.5
## 23   NA  1.5    NA    0.5
## 24   NA  1.5    NA    0.5
## 25   NA  1.5    NA    0.5
## 26   NA  1.5    NA    0.5
## 27   NA  1.5    NA    0.5
## 28   NA  1.5    NA    0.5
## 29   NA  1.5    NA    0.5
## 30   NA  1.5    NA    0.5
## 31   NA  1.5    NA    0.5
## 32   NA  1.5    NA    0.5
ggplot(iris) +
  aes(dims = dims(Sepal.Length:Petal.Width),
      color = Species) +
  # --------- the following gets wrapped up to geom_pca ------------
  dims_expand2() +
  geom_point(stat = StatPca)

knitr::knit_exit()