@@ -274,14 +274,14 @@ as.environment.python.builtin.object <- function(x) {
274274 if (inherits(x , " python.builtin.dict" )) {
275275
276276 names <- py_dict_get_keys_as_str(x )
277- names <- names [substr(names , 1 , 1 ) != ' _ ' ]
277+ names <- names [substr(names , 1 , 1 ) != " _ " ]
278278 Encoding(names ) <- " UTF-8"
279279 types <- rep_len(0L , length(names ))
280280
281281 } else {
282282 # get the names and filter out internal attributes (_*)
283283 names <- py_suppress_warnings(py_list_attributes(x ))
284- names <- names [substr(names , 1 , 1 ) != ' _ ' ]
284+ names <- names [substr(names , 1 , 1 ) != " _ " ]
285285 # replace function with `function`
286286 names <- sub(" ^function$" , " `function`" , names )
287287 names <- sort(names , decreasing = FALSE )
@@ -1351,43 +1351,45 @@ py_filter_classes <- function(classes) {
13511351}
13521352
13531353py_inject_r <- function () {
1354-
13551354 # don't inject 'r' if there's already an 'r' object defined
13561355 main <- import_main(convert = FALSE )
13571356 if (py_has_attr(main , " r" ))
13581357 return (FALSE )
13591358
1360- # define our 'R' class
1361- py_run_string(" class R(object): pass" )
1362-
1363- # extract it from the main module
1364- main <- import_main(convert = FALSE )
1365- R <- main $ R
1359+ builtins <- import_builtins(convert = FALSE )
1360+ if (! py_has_attr(builtins , " __R__" )) {
1361+ # define our 'R' class
1362+ py_run_string(" class R(object): pass" )
1363+ R <- main $ R
1364+
1365+ # copy it to 'builtins'
1366+ py_set_attr(builtins , " __R__" , R )
1367+
1368+ # remove the 'R' class object from '__main__'
1369+ py_del_attr(main , " R" )
1370+
1371+ # define the getters, setters we'll attach to the Python class
1372+ getter <- function (self , code ) {
1373+ envir <- py_resolve_envir()
1374+ object <- eval(parse(text = as_r_value(code )), envir = envir )
1375+ r_to_py(object , convert = is.function(object ))
1376+ }
13661377
1367- # define the getters, setters we'll attach to the Python class
1368- getter <- function ( self , code ) {
1369- envir <- py_resolve_envir( )
1370- object <- eval(parse( text = as_r_value(code )), envir = envir )
1371- r_to_py( object , convert = is.function( object ) )
1372- }
1378+ setter <- function ( self , name , value ) {
1379+ envir <- py_resolve_envir()
1380+ name <- as_r_value( name )
1381+ value <- as_r_value(value )
1382+ assign( name , value , envir = envir )
1383+ }
13731384
1374- setter <- function (self , name , value ) {
1375- envir <- py_resolve_envir()
1376- name <- as_r_value(name )
1377- value <- as_r_value(value )
1378- assign(name , value , envir = envir )
1385+ py_set_attr(R , " __getattr__" , getter )
1386+ py_set_attr(R , " __setattr__" , setter )
1387+ py_set_attr(R , " __getitem__" , getter )
1388+ py_set_attr(R , " __setitem__" , setter )
13791389 }
13801390
1381- py_set_attr(R , " __getattr__" , getter )
1382- py_set_attr(R , " __setattr__" , setter )
1383- py_set_attr(R , " __getitem__" , getter )
1384- py_set_attr(R , " __setitem__" , setter )
1385-
13861391 # now define the R object
1387- py_run_string(" r = R()" )
1388-
1389- # remove the 'R' class object
1390- py_del_attr(main , " R" )
1392+ py_run_string(" r = __R__()" )
13911393
13921394 # indicate success
13931395 TRUE
0 commit comments