@@ -93,10 +93,12 @@ encapsulate = function(method, .f, .args = list(), .opts = list(), .pkgs = chara
93
93
} else { # method == "callr"
94
94
require_namespaces(" callr" )
95
95
96
+ # callr does not copy the RNG state, so we need to do it manually
97
+ .rng_state = .GlobalEnv $ .Random.seed
96
98
logfile = tempfile()
97
99
now = proc.time()[3L ]
98
100
result = try(callr :: r(callr_wrapper ,
99
- list (.f = .f , .args = .args , .opts = .opts , .pkgs = .pkgs , .seed = .seed ),
101
+ list (.f = .f , .args = .args , .opts = .opts , .pkgs = .pkgs , .seed = .seed , .rng_state = .rng_state ),
100
102
stdout = logfile , stderr = logfile , timeout = .timeout ), silent = TRUE )
101
103
elapsed = proc.time()[3L ] - now
102
104
@@ -116,8 +118,10 @@ encapsulate = function(method, .f, .args = list(), .opts = list(), .pkgs = chara
116
118
log = c(log , sprintf(" [ERR] callr process exited with status %i" , status ))
117
119
}
118
120
result = NULL
121
+ } else {
122
+ if (! is.null(result $ rng_state )) assign(" .Random.seed" , result $ rng_state , envir = globalenv())
123
+ result = result $ result
119
124
}
120
-
121
125
log = parse_callr(log )
122
126
}
123
127
@@ -163,7 +167,7 @@ parse_callr = function(log) {
163
167
log []
164
168
}
165
169
166
- callr_wrapper = function (.f , .args , .opts , .pkgs , .seed ) {
170
+ callr_wrapper = function (.f , .args , .opts , .pkgs , .seed , .rng_state ) {
167
171
suppressPackageStartupMessages({
168
172
lapply(.pkgs , requireNamespace )
169
173
})
@@ -173,7 +177,10 @@ callr_wrapper = function(.f, .args, .opts, .pkgs, .seed) {
173
177
set.seed(.seed )
174
178
}
175
179
176
- withCallingHandlers(
180
+ # restore RNG state from parent R session
181
+ if (! is.null(.rng_state )) assign(" .Random.seed" , .rng_state , envir = globalenv())
182
+
183
+ result = withCallingHandlers(
177
184
tryCatch(do.call(.f , .args ),
178
185
error = function (e ) {
179
186
cat(" [ERR]" , gsub(" \r ?\n |\r " , " <br>" , conditionMessage(e )), " \n " )
@@ -185,4 +192,7 @@ callr_wrapper = function(.f, .args, .opts, .pkgs, .seed) {
185
192
invokeRestart(" muffleWarning" )
186
193
}
187
194
)
195
+
196
+ # copy new RNG state back to parent R session
197
+ list (result = result , rng_state = .GlobalEnv $ .Random.seed )
188
198
}
0 commit comments