Tôi đã được làm việc theo cách của mình thông qua Rcpp
hướng dẫn Dirk Eddelbuettel ở đây:Chạy biên soạn C++ với Rcpp
http://www.rinfinance.com/agenda/
Tôi đã học được làm thế nào để tiết kiệm ++ tập tin C trong một thư mục và gọi nó và chạy nó từ trong R. C++ tập tôi đang chạy được gọi là 'logabs2.ccp' và nội dung của nó là trực tiếp từ một trong slide Dirk của:
#include <Rcpp.h>
using namespace Rcpp;
inline double f(double x) { return ::log(::fabs(x)); }
// [[Rcpp::export]]
std::vector<double> logabs2(std::vector<double> x) {
std::transform(x.begin(), x.end(), x.begin(), f);
return x;
}
tôi chạy nó với mã R này:
library(Rcpp)
sourceCpp("c:/users/mmiller21/simple r programs/logabs2.cpp")
logabs2(seq(-5, 5, by=2))
# [1] 1.609438 1.098612 0.000000 0.000000 1.098612 1.609438
Tôi đang chạy mã trên máy tính Windows 7 từ bên trong R GUI dường như cài đặt theo mặc định. Tôi cũng đã cài đặt phiên bản mới nhất của Rtools
. Mã R ở trên dường như mất một thời gian tương đối dài để chạy. Tôi nghi ngờ hầu hết thời gian đó được dành để biên dịch mã C++ và khi mã C++ được biên dịch, nó chạy rất nhanh. Microbenchmark
chắc chắn cho thấy rằng Rcpp
làm giảm thời gian tính toán.
Tôi chưa bao giờ sử dụng C++ cho đến bây giờ, nhưng tôi biết rằng khi tôi biên dịch mã C, tôi nhận được tệp * .exe. Tôi đã tìm kiếm ổ cứng của mình từ một tệp có tên là logabs2.exe
nhưng không thể tìm thấy một tệp. Tôi tự hỏi liệu mã C++ ở trên có thể chạy nhanh hơn nếu tệp logabs2.exe
được tạo. Có thể tạo một tập tin logabs2.exe
và lưu nó vào một thư mục ở đâu đó và sau đó Rcpp gọi tập tin đó bất cứ khi nào tôi muốn sử dụng nó? Tôi không biết liệu điều đó có hợp lý hay không. Nếu tôi có thể lưu trữ một hàm C++ trong tệp * .exe thì có lẽ tôi sẽ không phải biên dịch hàm mỗi khi tôi muốn sử dụng nó với Rcpp và sau đó có lẽ mã Rcpp sẽ còn nhanh hơn nữa.
Xin lỗi nếu câu hỏi này không có ý nghĩa hoặc trùng lặp. Nếu có thể lưu trữ hàm C++ dưới dạng tệp * .exe, tôi hy vọng một người nào đó sẽ chỉ cho tôi cách sửa đổi mã R của tôi ở trên để chạy nó. Cảm ơn bạn đã giúp đỡ với điều này hoặc để đặt tôi thẳng vào lý do tại sao những gì tôi đề nghị là không thể hoặc được đề nghị.
Tôi rất mong được thấy cuốn sách mới của Dirk.
Bạn đã xem lệnh 'R CMD SHLIB' chưa? Với điều đó bạn chỉ có thể biên dịch hàm C++ của bạn thành một tệp dll và sau đó tải tệp đã biên dịch bằng 'dyn.load()'. Có một cái nhìn tại '? SHLIB' và'? Dyn.load' để biết chi tiết! – user1981275
@ user1981275 Cảm ơn bạn đã bình luận. Cho đến nay tôi đã nhận được đến thời điểm này: C: \ Program Files \ R \ R-3.0.1 \ bin \ x64> rcmd SHLIB -oc: \ người dùng \ mmiller21 \ documents \ r \ win-library \ 3.0 \ rcpp \ include \ logabs2.dll c: \ users \ mmiller21 \ documents \ r \ win \ thư viện \ 3.0 \ rcpp \ include \ logabs2.cpp Tôi nhận được thông báo sau: make: *** Không có quy tắc để làm cho mục tiêu 'c: \ users \ mmiller21 \ documents \ r \ win-library \ 3.0 \ rcpp \ include \ logabs2.o ', cần thiết bởi' c: \ users \ mmiller21 \ documents \ r \ win \ thư viện \ 3.0 \ rcpp \ include \ logabs2.dll '. Dừng lại. Thông báo dường như nói rằng tôi đang thiếu một tệp đối tượng, quen thuộc với tôi từ công việc của tôi với C. –
Tôi đang sử dụng cửa sổ lệnh DOS. Nếu vấn đề thực sự là một tập tin đối tượng bị thiếu, bạn có thể gợi ý cách tôi có thể tạo một tệp đối tượng không? Có lẽ một khi nó được tạo ra nó sẽ đi vào một danh sách cùng với logabs2.cpp ở cuối lệnh trong bình luận trước? Cảm ơn bạn bất kể. –