@@ -85,38 +85,42 @@ impl RFunction {
85
85
}
86
86
87
87
pub fn call_in ( & mut self , env : SEXP ) -> Result < RObject > {
88
- unsafe {
89
- let user_call = self . call . build ( ) ;
90
- let eval_call = RCall :: new ( r_symbol ! ( "safe_evalq" ) )
91
- . add ( user_call. sexp )
92
- . add ( env)
93
- . build ( ) ;
88
+ let user_call = self . call . build ( ) ;
89
+ r_safe_eval ( user_call, env. into ( ) )
90
+ }
91
+ }
94
92
95
- let result = RObject :: new ( Rf_eval ( eval_call. sexp , HARP_ENV . unwrap ( ) ) ) ;
93
+ pub fn r_safe_eval ( expr : RObject , env : RObject ) -> crate :: Result < RObject > {
94
+ unsafe {
95
+ let eval_call = RCall :: new ( r_symbol ! ( "safe_evalq" ) )
96
+ . add ( expr. sexp )
97
+ . add ( env)
98
+ . build ( ) ;
96
99
97
- // Invariant of return value: List of length 2 [output, error].
98
- // These are exclusive.
99
- let out = r_list_get ( result. sexp , 0 ) ;
100
- let err = r_list_get ( result. sexp , 1 ) ;
100
+ let result = RObject :: new ( Rf_eval ( eval_call. sexp , HARP_ENV . unwrap ( ) ) ) ;
101
101
102
- if err != r_null ( ) {
103
- let code = r_stringify ( user_call. sexp , "\n " ) ?;
102
+ // Invariant of return value: List of length 2 [output, error].
103
+ // These are exclusive.
104
+ let out = r_list_get ( result. sexp , 0 ) ;
105
+ let err = r_list_get ( result. sexp , 1 ) ;
104
106
105
- // Invariant of error slot: Character vector of length 2 [message, trace],
106
- // with `trace` possibly an empty string.
107
- let err = CharacterVector :: new ( err) ?;
107
+ if err != r_null ( ) {
108
+ let code = r_stringify ( expr. sexp , "\n " ) ?;
108
109
109
- let message = err. get_value ( 0 ) ?;
110
- let trace = err. get_value ( 1 ) ?;
110
+ // Invariant of error slot: Character vector of length 2 [message, trace],
111
+ // with `trace` possibly an empty string.
112
+ let err = CharacterVector :: new ( err) ?;
111
113
112
- return Err ( Error :: EvaluationError {
113
- code,
114
- message : message + "\n Trace:\n " + & trace,
115
- } ) ;
116
- }
114
+ let message = err. get_value ( 0 ) ?;
115
+ let trace = err. get_value ( 1 ) ?;
117
116
118
- return Ok ( RObject :: new ( out) ) ;
117
+ return Err ( Error :: EvaluationError {
118
+ code,
119
+ message : message + "\n Trace:\n " + & trace,
120
+ } ) ;
119
121
}
122
+
123
+ return Ok ( RObject :: new ( out) ) ;
120
124
}
121
125
}
122
126
0 commit comments