Хідлі,
Ви однозначно можете записати код C ++, подібний до коду С.
Я розумію, що ви говорите про те, що C ++ складніше, ніж C. Це якщо ви хочете освоїти все: об'єкти, шаблони, STL, мета-програмування шаблонів тощо ... більшості людей не потрібні ці речі і можуть просто покладатися на інших йому. Реалізація Rcpp дуже складна, але тільки тому, що ви не знаєте, як працює ваш холодильник, це не означає, що ви не можете відкрити двері та забрати свіже молоко ...
З багатьох ваших внесків в R, мене вражає те, що ви вважаєте, що R дещо втомлює (маніпулювання даними, графіка, стринг-маніпуляція тощо). Добре підготуйтеся до ще багатьох сюрпризів із внутрішнім API API R. Це дуже нудно.
Час від часу я читав посібники з R-exts або R-ints. Це допомагає. Але більшу частину часу, коли мені дуже хочеться дізнатися про щось, я заходжу в джерело R, а також у джерело пакунків, написаних, наприклад, Саймоном (там, як правило, багато чому навчитися).
Rcpp призначений для усунення цих виснажливих аспектів API.
Ви можете судити про те, що вам здається складнішим, затуманеним і т. Д. ... на основі кількох прикладів. Ця функція створює вектор символів за допомогою API C:
SEXP foobar(){
SEXP ab;
PROTECT(ab = allocVector(STRSXP, 2));
SET_STRING_ELT( ab, 0, mkChar("foo") );
SET_STRING_ELT( ab, 1, mkChar("bar") );
UNPROTECT(1);
}
Використовуючи Rcpp, ви можете записати ту саму функцію, що і:
SEXP foobar(){
return Rcpp::CharacterVector::create( "foo", "bar" ) ;
}
або:
SEXP foobar(){
Rcpp::CharacterVector res(2) ;
res[0] = "foo" ;
res[1] = "bar" ;
return res ;
}
Як сказав Дірк, на декількох віньєтках є й інші приклади. Ми також зазвичай вказуємо людей на тести наших одиниць, тому що кожен з них перевіряє дуже конкретну частину коду і дещо сам пояснює.
Я, очевидно, тут упереджений, але рекомендую ознайомитись з Rcpp замість вивчення API API R, а потім перейдіть до списку розсилки, якщо щось не зрозуміло або не здається можливим з Rcpp.
У будь-якому випадку, кінець кроку продажу.
Я думаю, все залежить від того, який код ви хочете написати в підсумку.
Ромен