Hi folks,

  I have an R object (a `thpr` likelihood-profile from the lme4
package, in case that's useful) which contains formulas as attributes,
which in turn have associated environments.  When I store the object,
the contents of the environments get serialized as well, which
inflates the size of the stored files enormously.

   I'm not worried that stripping out the environments will break
anything when the objects are restored/deserialized from the files.

  However, attempting to strip environments from the formulas is
having surprising and counterintuitive (to me!) effects, i.e.
stripping the environment from one formula is messing up the structure
of the object.

  I might try adapting something from the 'butcher' package
<https://github.com/tidymodels/butcher>, which includes functionality
like

butcher:::axe_env.terms

function (x, verbose = FALSE, ...)
{
    old <- x
    attr(x, ".Environment") <- rlang::base_env()
    add_butcher_attributes(x, old, verbose = verbose)
}


 but if anyone has useful general ideas in the meantime I would
appreciate them ...

  cheers
   Ben Bolker
---


My current [BROKEN] code looks something like this:

    drop_form_env <- function(x, debug = TRUE) {
        dir <- c("forward", "backward")
        for (d in dir) {
            for (i in seq(length(attr(x, d)))) {
                if (debug) {
                    print(attr(attr(x,d)[[i]], "formula"))
                    cat(d, i, "\n")
                }
                f <- attr(attr(x, d)[[i]], "formula")
                environment(f) <- emptyenv()
                attr(attr(x, d)[[i]], "formula") <- f
            }
        }
        x
    }

and the structure of a typical object is:

str(x)
Classes ‘thpr’ and 'data.frame':    876 obs. of  10 variables:
 $ .zeta                  : num  -5 -4.44 -3.87 -3.3 -2.71 ...
 $ sd_(Intercept)|district: num  0.154 0.186 0.218 0.252 0.287 ...
 $ (Intercept)            : num  0.03069 0.02521 0.01932 0.01309 0.00661 ...
 $ age                    : num  0.0771 0.0752 0.0733 0.0714 0.0697 ...
 $ I(age^2)               : num  -1.41 -1.42 -1.42 -1.43 -1.44 ...
 $ urban1                 : num  -0.373 -0.37 -0.367 -0.363 -0.36 ...
 $ livch1                 : num  -0.623 -0.627 -0.632 -0.636 -0.641 ...
 $ livch2                 : num  0.163 0.161 0.159 0.157 0.156 ...
 $ livch3                 : num  0.248 0.249 0.25 0.251 0.252 ...
 $ .par                   : Factor w/ 8 levels "(Intercept)",..: 7 7 7
7 7 7 7 7 7 7 ...
 - attr(*, "forward")=List of 8
  ..$ sd_(Intercept)|district:List of 2
  .. ..$ knots       : num [1:20] 0.154 0.186 0.218 0.252 0.287 ...
  .. ..$ coefficients: num [1:20, 1:4] -5 -4.44 -3.87 -3.3 -2.71 ...
  .. ..- attr(*, "formula")=Class 'formula'  language .zeta ~
`sd_(Intercept)|district`
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdf5180440>
  .. ..- attr(*, "class")= chr [1:3] "npolySpline" "polySpline" "spline"
  ..$ (Intercept)            : NULL
  ..$ age                    : NULL
  ..$ I(age^2)               :List of 2
  .. ..$ knots       : num [1:20] -2.68 -2.54 -2.41 -2.27 -2.13 ...
  .. ..$ coefficients: num [1:20, 1:4] -4.93 -4.37 -3.82 -3.26 -2.7 ...
  .. ..- attr(*, "formula")=Class 'formula'  language .zeta ~ `I(age^2)`
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdefe46b20>
  .. ..- attr(*, "class")= chr [1:3] "npolySpline" "polySpline" "spline"
  ..$ urban1                 :List of 2
  .. ..$ knots       : num [1:20] -0.649 -0.615 -0.58 -0.546 -0.512 ...
  .. ..$ coefficients: num [1:20, 1:4] -4.93 -4.38 -3.82 -3.26 -2.7 ...
  .. ..- attr(*, "formula")=Class 'formula'  language .zeta ~ urban1
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdeb1f72f0>
  .. ..- attr(*, "class")= chr [1:3] "npolySpline" "polySpline" "spline"
  ..$ livch1                 :List of 2
  .. ..$ knots       : num [1:20] -1.238 -1.171 -1.104 -1.039 -0.973 ...
  .. ..$ coefficients: num [1:20, 1:4] -4.92 -4.36 -3.8 -3.25 -2.69 ...
  .. ..- attr(*, "formula")=Class 'formula'  language .zeta ~ livch1
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbe0d5b57b8>
  .. ..- attr(*, "class")= chr [1:3] "npolySpline" "polySpline" "spline"
  ..$ livch2                 :List of 2
  .. ..$ knots       : num [1:20] -0.2938 -0.2379 -0.1821 -0.1265 -0.0709 ...
  .. ..$ coefficients: num [1:20, 1:4] -4.5 -3.95 -3.39 -2.83 -2.27 ...
  .. ..- attr(*, "formula")=Class 'formula'  language .zeta ~ livch2
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdfabc0800>
  .. ..- attr(*, "class")= chr [1:3] "npolySpline" "polySpline" "spline"
  ..$ livch3                 :List of 2
  .. ..$ knots       : num [1:19] -0.23013 -0.17071 -0.11142 -0.05223
0.00687 ...
  .. ..$ coefficients: num [1:19, 1:4] -4.59 -4.03 -3.47 -2.91 -2.36 ...
  .. ..- attr(*, "formula")=Class 'formula'  language .zeta ~ livch3
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbe0fdc9960>
  .. ..- attr(*, "class")= chr [1:3] "npolySpline" "polySpline" "spline"
 - attr(*, "backward")=List of 8
  ..$ sd_(Intercept)|district:List of 2
  .. ..$ knots       : num [1:20] -5 -4.44 -3.87 -3.3 -2.71 ...
  .. ..$ coefficients: num [1:20, 1:4] 0.154 0.186 0.218 0.252 0.287 ...
  .. ..- attr(*, "formula")=Class 'formula'  language
`sd_(Intercept)|district` ~ .zeta
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbded1c2c70>
  .. ..- attr(*, "class")= chr [1:2] "polySpline" "spline"
  ..$ (Intercept)            :List of 2
  .. ..$ message: chr "system is computationally singular: reciprocal
condition number = 1.10309e-16"
  .. ..$ call   : language solve.default(des, y)
  .. ..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
  ..$ age                    :List of 2
  .. ..$ message: chr "system is computationally singular: reciprocal
condition number = 1.41653e-16"
  .. ..$ call   : language solve.default(des, y)
  .. ..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
  ..$ I(age^2)               :List of 2
  .. ..$ knots       : num [1:20] -4.93 -4.37 -3.82 -3.26 -2.7 ...
  .. ..$ coefficients: num [1:20, 1:4] -2.68 -2.54 -2.41 -2.27 -2.13 ...
  .. ..- attr(*, "formula")=Class 'formula'  language `I(age^2)` ~ .zeta
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbded1b6e88>
  .. ..- attr(*, "class")= chr [1:2] "polySpline" "spline"
  ..$ urban1                 :List of 2
  .. ..$ knots       : num [1:20] -4.93 -4.38 -3.82 -3.26 -2.7 ...
  .. ..$ coefficients: num [1:20, 1:4] -0.649 -0.615 -0.58 -0.546 -0.512 ...
  .. ..- attr(*, "formula")=Class 'formula'  language urban1 ~ .zeta
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdfb2db1d8>
  .. ..- attr(*, "class")= chr [1:2] "polySpline" "spline"
  ..$ livch1                 :List of 2
  .. ..$ knots       : num [1:20] -4.92 -4.36 -3.8 -3.25 -2.69 ...
  .. ..$ coefficients: num [1:20, 1:4] -1.238 -1.171 -1.104 -1.039 -0.973 ...
  .. ..- attr(*, "formula")=Class 'formula'  language livch1 ~ .zeta
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdfb2c5fe8>
  .. ..- attr(*, "class")= chr [1:2] "polySpline" "spline"
  ..$ livch2                 :List of 2
  .. ..$ knots       : num [1:20] -4.5 -3.95 -3.39 -2.83 -2.27 ...
  .. ..$ coefficients: num [1:20, 1:4] -0.2938 -0.2379 -0.1821 -0.1265
-0.0709 ...
  .. ..- attr(*, "formula")=Class 'formula'  language livch2 ~ .zeta
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdf91af548>
  .. ..- attr(*, "class")= chr [1:2] "polySpline" "spline"
  ..$ livch3                 :List of 2
  .. ..$ knots       : num [1:19] -4.59 -4.03 -3.47 -2.91 -2.36 ...
  .. ..$ coefficients: num [1:19, 1:4] -0.23013 -0.17071 -0.11142
-0.05223 0.00687 ...
  .. ..- attr(*, "formula")=Class 'formula'  language livch3 ~ .zeta
  .. .. .. ..- attr(*, ".Environment")=<environment: 0x5fbdf91ad378>
  .. ..- attr(*, "class")= chr [1:2] "polySpline" "spline"
 - attr(*, "lower")= num [1:8] 0 -Inf -Inf -Inf -Inf ...
 - attr(*, "upper")= num [1:8] Inf Inf Inf Inf Inf ...
>

______________________________________________
[email protected] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to