2012-02-09 30 views
6

Tôi không thể tìm thấy tài liệu cho việc này. Có vẻ như mã nguồn R sử dụng NewEnvironmentR_NewHashedEnv nhưng không có mã nguồn nào trong các tiêu đề công khai, vì vậy có vẻ như chúng không có sẵn cho tôi với tư cách người dùng. Tôi nên sử dụng chức năng nào (hoặc những dòng mã nào) để tạo ENVSXP mới?Làm thế nào để tạo một môi trường R mới từ C?

+0

Nếu bạn cho phép C++, tôi có thể chỉ cho bạn cách để làm điều đó thông qua Rcpp. –

Trả lời

3

Bạn muốn allocSExp:

/* C code in foo.c */ 
#include "Rinternals.h" 
SEXP foo() { 
    SEXP res = allocSExp(ENVSXP); 
    return res; 
} 

> # R code (after running R CMD SHLIB foo.c) 
> dyn.load("foo.dll") 
> .Call("foo") 
<environment: 0x016a4084> 
+1

Tại sao không phải là một hoặc hai lót bằng cách sử dụng [inline] (http://cran.r-project.org/package=inline)? Ngoài ra, bạn phân bổ, bạn không cần phải BẢO VỆ/KHÔNG BẢO VỆ? –

+0

@DirkEddelbuettel: buồn khi nói, tôi không sử dụng nội tuyến thường xuyên (F- cho tôi). Tôi không gọi bất kỳ macro nào sau khi phân bổ trong ví dụ đơn giản này, vì vậy không có khả năng phân bổ khác (và GC tiềm năng) trước khi hàm của tôi thoát. Tôi nên rõ ràng hơn về điều đó. –

+0

Rõ ràng là một trường hợp cố gắng của tôi quá khó. Ở đó tôi đã tìm kiếm một số chức năng allocEnv, khi phân bổ SEXP cơ bản nhất là tất cả những gì tôi cần. [Và có, tôi đã thêm các macro yelly thích hợp]. Bạn nhận được điểm thưởng nếu bạn có thể chỉ cho tôi tài liệu thảo luận về việc sử dụng các chức năng như allocSExp ... –

Các vấn đề liên quan