I came across a similar problem and implemented it this way using Base R. I tend to make things harder on myself by not using third party packages like R6. To solve this problem I access the environment where the object methods are defined and store variables that way.
In this example, I am trying to implement a MinMaxScaler like that found in scikit learn:
## Base reference class
setRefClass(
  "Transformer",
  contains = "VIRTUAL",
  methods = list(
    fit = function(data) stop("Must implement"),
    transform = function(data) stop("Must implement"),
    fit_transform = function(data) {
      fit(data)
      transform(data)
    }
  ))
Concrete implementation of the Transformer API. In the fit method, I access the environment where fit is defined. I then use that environment to store whatever variables I need for intermediate calculations and to update the object in place -- just like sklearn.
MinMaxScaler <-setRefClass(
  "MinMaxScaler",
  contains = "Transformer",
  fields = c(feature_range = "numeric"),
  methods = list(
    fit = function(data) {
      env <- environment(fun = .self$fit)
      rng <- range(data, na.rm=TRUE)
      env$data_range_ <- diff(range(data, na.rm=TRUE))
      env$data_min_ <- rng[[1]]
      env$data_max_ <- rng[[2]]
    },
    transform = function(data) {
      env <- environment(fun = .self$transform)
      scalef <- diff(range(feature_range))
      scalef * (data - env$data_min_) / env$data_range_  + min(feature_range)
    }
  )
)
To demonstrate this pattern, I will create two scalers and fit them separately:
> ## Dummy data
> set.seed(123)
> z <- rnorm(1e4)
> summary(z)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-3.845320 -0.667969 -0.011089 -0.002372  0.673347  3.847768 
> 
> scaler1 <- MinMaxScaler(feature_range=c(0, 50))
> summary(scaler1$fit_transform(z))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   20.65   24.92   24.98   29.37   50.00 
> 
> scaler2 <- MinMaxScaler(feature_range=c(-100, 100))
> summary(scaler2$fit_transform(z))
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-100.00000  -17.39725   -0.32011   -0.09347   17.47344  100.00000 
> 
> ## to show the scalers are distinct and not sharing private vars
> summary(scaler1$transform(z))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   20.65   24.92   24.98   29.37   50.00 
> summary(scaler2$transform(z))
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-100.00000  -17.39725   -0.32011   -0.09347   17.47344  100.00000