Я пытаюсь представить простой класс Student в C ++ для R, используя Rcpp в пакете.Вот мои настройки ...
src /
Student.hpp // Student.hpp
#ifndef Student_hpp
#define Student_hpp
#include <string>
#include <vector>
class Student
{
public:
// Constructor
Student(std::string name, int age, bool male);
// Getters
std::string GetName();
int GetAge();
bool IsMale();
std::vector<int> GetFavoriteNumbers();
// Methods
bool LikesBlue();
private:
// Member variables
std::string name;
int age;
bool male;
std::vector<int> favoriteNumbers;
};
#endif /* Student_hpp */
Student.cpp // Student.cpp
#include "Student.hpp"
// Constructor
Student::Student(std::string name, int age, bool male) {
this->name = name;
this->age = age;
this->male = male;
this->favoriteNumbers = {2, 3, 5, 7, 11};
}
// Getters
bool Student::IsMale() { return male; }
int Student::GetAge() { return age; }
std::string Student::GetName() { return name; }
std::vector<int> Student::GetFavoriteNumbers() { return favoriteNumbers; }
// Methods
bool Student::LikesBlue() {
return (male || age >= 10);
}
glue.cpp // glue.cpp
// To use c++11, first run: Sys.setenv("PKG_CXXFLAGS"="-std=c++11") ...or use a Makevars file
#include <Rcpp.h>
#include "Student.hpp"
using namespace Rcpp;
//' Simulate a student
//'
//' @export
// [[Rcpp::export]]
std::vector<int> simulate_student() {
Student s = Student("bob", 10, true);
return s.GetFavoriteNumbers();
}
// Expose (some of) the Student class
RCPP_MODULE(Student){
class_<Student>("Student")
.constructor<std::string,int,bool>()
.method("LikesBlue", &Student::LikesBlue)
;
}
R /
student.R #' student
#'
#' A cool package
#'
#' Imports
#' @useDynLib student, .registration = TRUE
#' @importFrom Rcpp sourceCpp
"_PACKAGE"
Rcpp::loadModule(module = "Student", TRUE)
После вызова devtools::document()
я получаю следующий файл NAMESPACE
NAMESPACE # Generated by roxygen2: do not edit by hand
export(simulate_student)
importFrom(Rcpp,sourceCpp)
useDynLib(student, .registration = TRUE)
Теперь, после выполнения очистки и перестройки из RStudio (т.е. R CMD INSTALL --preclean --no-multiarch --with-keep.source student
), пакет компилируется и загружается без проблем.Если я запускаю функцию simulate_student()
, я получаю ожидаемый результат.Однако, когда я пытаюсь создать новый объект Student с stud <- new(Student)
, я получаю Ошибка в .getClassesFromCache (Class): объект 'Student' не найден
Эта проблема похожа на этот пост но принятый ответ, похоже, не решает мою проблемуКроме того, я изучил исходный код Annoy , упомянутый Дирком, но я не вижу каких-либо полезных отличий между этим кодом и моим, за исключением фрагментов RCPP_EXPOSED_CLASS_NODECL(AnnoyEuclidean)
, которые я пытался поместить в свой код.код, но также не помогают.