Tôi tự hỏi liệu có ai có thể minh họa cho tôi cách R thực hiện cuộc gọi C
từ lệnh R được nhập vào dấu nhắc của bảng điều khiển hay không. Tôi đặc biệt bối rối bởi các đối số chức năng a) của R
và b) gọi hàm.Tìm hiểu cách thức. Các hàm C bên trong được xử lý trong R
Ví dụ: trong trường hợp này là set.seed()
. Tự hỏi làm thế nào nó hoạt động Tôi gõ tên tại dấu nhắc, lấy nguồn (look here for more on that), xem có cuối cùng là .Internal(set.seed(seed, i.knd, normal.kind)
, do đó, dutifully tìm kiếm tên chức năng có liên quan trong phần .Internals
của /src/names.c
, tìm thấy nó được gọi là do_setseed
và là trong RNG.c
đó dẫn tôi đến ...
SEXP attribute_hidden do_setseed (SEXP call, SEXP op, SEXP args, SEXP env)
{
SEXP skind, nkind;
int seed;
checkArity(op, args);
if(!isNull(CAR(args))) {
seed = asInteger(CAR(args));
if (seed == NA_INTEGER)
error(_("supplied seed is not a valid integer"));
} else seed = TimeToSeed();
skind = CADR(args);
nkind = CADDR(args);
//...
//DO RNG here
//...
return R_NilValue;
}
- gì
CAR
,CADR
,CADDR
? Nghiên cứu của tôi dẫn tôi tin rằng chúng là cấu trúc có liên quan đến ảnh hưởng đếnLisp
liên quan đến danh sách nhưng ngoài ra tôi không hiểu những chức năng này làm gì hoặc lý do tại sao chúng cần thiết. checkArity()
làm gì?SEXP args
có vẻ tự giải thích, nhưng đây có phải là danh sách các đối số được chuyển trong lệnh gọi hàm không?SEXP op
đại diện cho điều gì? Tôi lấy điều này để có nghĩa là toán tử (giống như trong các hàm nhị phân như+
), nhưng sau đó làSEXP call
là gì?
Có ai có thể chảy qua những gì xảy ra khi tôi gõ
set.seed(1)
tại R console nhanh chóng, lên đến điểm mà tại đó skind
và nkind
được định nghĩa? Tôi thấy tôi không thể hiểu rõ mã nguồn ở cấp độ này và đường dẫn từ trình thông dịch đến hàm C.
Bạn có thể bắt đầu tại http://adv-r.had.co.nz/C-interface.html - Tôi sẽ sớm viết thêm một số chi tiết cho ví dụ cụ thể này. – hadley
@hadley cảm ơn, tôi sẽ trải qua tối nay. Tôi thực sự chờ đợi cuốn sách của bạn được phát hành! Chẳng bao lâu tôi hy vọng. :-) –
@ SimonO101: Tôi muốn thêm "... trong R" vào tiêu đề câu hỏi –