Изменение подраздела Rcpp :: List в отдельной функции по ссылке - PullRequest
0 голосов
/ 24 августа 2018

Я бы хотел, чтобы через функцию можно было изменить часть Rcpp::List. Поскольку Rcpp::List является указателем на некоторые данные R, я подумал, что можно будет сделать что-то вроде этого:

void modifyList(Rcpp::List l) {
  l["x"] = "x";
}

// [[Rcpp::export]]
Rcpp::List rcppTest() {
  Rcpp::List res;
  res["a"] = Rcpp::List::create();
  modifyList(res["a"]);
  return res;
}

Я ожидал получить в качестве возвращаемого значения rcppTest список с элементом "x" значения "x". Однако возвращенный список пуст.

Если вместо этого я использую подпись modifyList(Rcpp::List& l), я получаю ошибку компиляции

rcppTest.cpp:17:6: note: candidate function not viable: no known conversion from 'Rcpp::Vector<19, PreserveStorage>::NameProxy' (aka 'generic_name_proxy<19, PreserveStorage>') to 'Rcpp::List &' (aka 'Vector<19> &') for 1st argument

Как я могу изменить часть Rcpp::List с помощью функции?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Это работает:

// [[Rcpp::export]]
void modifyList(List& l, std::string i) {
  l[i]= "x";
}

// [[Rcpp::export]]
Rcpp::List rcppTest() {
  Rcpp::List res;
  res["a"] = Rcpp::List::create();
  modifyList(res,"a");
  return res;
}

и дает:

> rcppTest()
$`a`
[1] "x"

Проблема в том, что вы пытаетесь:

error: invalid initialization of non-const reference of type 'Rcpp::List& {aka Rcpp::Vector<19>&}'
0 голосов
/ 24 августа 2018

Короче говоря, изменение списка по ссылке невозможно. В этом случае вы должны вернуть Rcpp::List, как указывает @RalfStubner из комментариев.

, например

#include<Rcpp.h>

// Specified return type of List
Rcpp::List modifyList(Rcpp::List l) {
  l["x"] = "x";
  return l;
}

// [[Rcpp::export]]
Rcpp::List rcppTest() {
  Rcpp::List res;
  res["a"] = Rcpp::List::create();

  // Store result back into "a"
  res["a"] = modifyList(res["a"]);

  return res;
}

Тест:

rcppTest()
# $a
# $a$x
# [1] "x"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...