@@ -28,14 +28,43 @@ setClass(
2828setMethod(
2929 " initialize" ,
3030 " qenv" ,
31- function (.Object , .xData = new.env(parent = parent.env(.GlobalEnv )), ... ) { # nolint: object_name.
32- # .xData needs to be unnamed as the `.environment` constructure requires 1
33- # unnamed formal argument. See methods::findMethods("initialize")$.environment
34- .Object <- methods :: callNextMethod(.Object , .xData , ... ) # nolint: object_name.
31+ function (.Object , # nolint: object_name.
32+ .xData , # nolint: object_name.
33+ code = character (0L ),
34+ warnings = rep(" " , length(code )),
35+ messages = rep(" " , length(code )),
36+ id = integer(0L ),
37+ ... ) {
38+ # # Pre-process parameters to ensure they are ready to be used by parent constructors
39+ stopifnot(" `code` must be a character or language object." = any(is.language(code ), is.character(code )))
3540
36- checkmate :: assert_environment(.xData )
37- lockEnvironment(.xData , bindings = TRUE )
38- .Object @ .xData <- .xData # nolint: object_name.
41+ if (is.language(code )) {
42+ code <- paste(lang2calls(code ), collapse = " \n " )
43+ }
44+ if (length(code )) {
45+ code <- paste(code , collapse = " \n " )
46+ }
47+
48+ if (length(id ) == 0L ) {
49+ id <- sample.int(.Machine $ integer.max , size = length(code ))
50+ }
51+
52+ new_xdata <- if (rlang :: is_missing(.xData )) {
53+ new.env(parent = parent.env(.GlobalEnv ))
54+ } else {
55+ checkmate :: assert_environment(.xData )
56+ rlang :: env_clone(.xData , parent = parent.env(.GlobalEnv ))
57+ }
58+ lockEnvironment(new_xdata , bindings = TRUE )
59+
60+ # .xData needs to be unnamed as the `.environment` constructor allows at
61+ # most 1 unnamed formal argument of class `environment`.
62+ # See methods::findMethods("initialize")$.environment
63+ .Object <- methods :: callNextMethod( # nolint: object_name.
64+ # Mandatory use of `xData` to build a correct [email protected] 65+ .Object , new_xdata ,
66+ code = code , messages = messages , warnings = warnings , id = id , ...
67+ )
3968
4069 .Object
4170 }
0 commit comments