use libR_sys::*;
use std::os::raw;
use std::sync::Once;
macro_rules! cstr_mut {
($s: expr) => {
concat!($s, "\0").as_ptr() as *mut raw::c_char
};
}
static START_R: Once = Once::new();
pub fn start_r() {
START_R.call_once(|| {
unsafe {
if std::env::var("R_HOME").is_err() {
std::env::set_var("R_HOME", env!("R_HOME"));
}
Rf_initialize_R(
3,
[cstr_mut!("R"), cstr_mut!("--slave"), cstr_mut!("--no-save")].as_mut_ptr(),
);
R_CStackLimit = usize::max_value();
setup_Rmainloop();
}
});
}
pub fn end_r() {
unsafe {
R_RunExitFinalizers();
R_CleanTempDir();
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_engine() {
start_r();
start_r();
}
}