Rcpp: изменить элемент списка в списке списка - PullRequest
0 голосов
/ 12 ноября 2018

Изменение элемента списка в списке списка.

К сожалению, я не смог найти ответ на свой вопрос на форуме.

Используя rcpp, я хочу напрямую изменить элемент списка в списке. У меня есть следующий подход:

// [[Rcpp::export]]
void test(){
    Environment env = Environment::global_env();
    List outerList = env["ListR"];
    List innerList = polymeraseFlagList[0];

    outerList((1)) ) "test";                        // correctly changing inner list
    CharacterVector innerStr = innerList[1];    // correctly access to inner list element
}   

Однако я могу изменить только полный список [i], а не один элемент: list [[i]] or list [i][j].

outerList[i][j] = "new inner list element";     // not working
outerList[[i]]  = "new inner list";             // not working

Я могу извлечь внутренний список, но здесь я изменяю только вновь созданный список, а не старый список. Для меня важно изменить список в R Workspace напрямую. Конечно, я мог бы изменить только что созданный список, а затем назначить его старому. Однако я надеюсь, что здесь есть более элегантное решение.

Я также пытался объявить список перед его назначением, чтобы у меня уже был вложенный список, к которому я могу обращаться, как обычно. К сожалению, это не сработало.

List outerList = List::create(Named("lst"));    // not working

В конце я хочу, чтобы было возможно следующее (измените переменную непосредственно в рабочей области R):

// [[Rcpp::export]]
void test(){
    Environment env = Environment::global_env();
    List outerList = env["ListR"];

    CharacterVector innerStr = outerList[i][j];
    CharacterVector innerList = outerList[[i]]
    innerList[i][j] = "new String";
}   

Было бы здорово, если бы кто-то мог мне помочь.

Большое спасибо:)

1 Ответ

0 голосов
/ 12 ноября 2018

Я обнаружил, что некоторые из ваших опубликованных кодов трудны для понимания, но это довольно простая задача, будь то жесткий доступ к списку из глобальной среды в R, как вы впервые попробовали, или передача списка какпараметр;используя код C ++

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
void test(List x) {
    CharacterVector tmp = x[0];
    tmp[0] = "Z";
    x[0] = tmp;
}

// [[Rcpp::export]]
void test2() {
    Environment env = Environment::global_env();
    List x = env["ListR"];
    CharacterVector tmp = x[0];
    tmp[0] = "Y";
    x[0] = tmp;
}

/*** R
ListR <- list(a = LETTERS[1:3])
ListR
test(ListR)
ListR
test2()
ListR
*/

Я получаю R

> Rcpp::sourceCpp("modify-list.cpp")

> ListR <- list(a = LETTERS[1:3])

> ListR
$a
[1] "A" "B" "C"


> test(ListR)

> ListR
$a
[1] "Z" "B" "C"


> test2()

> ListR
$a
[1] "Y" "B" "C"

Обновление

Это также довольно просто распространить на список в списке;используя код C ++

#include <Rcpp.h>

using namespace Rcpp;

// For when you need to modify an element of a list within a list
// [[Rcpp::export]]
void test3() {
    Environment env = Environment::global_env();
    List y = env["listR"];
    List x = y[0];
    CharacterVector tmp = x[0];
    tmp[0] = "Z";
    x[0] = tmp;
}

Я получаю следующее в R

Rcpp::sourceCpp("modify-list.cpp")
listR = list(list())
listR[[1]] = list(LETTERS[1:3])
listR
# [[1]]
# [[1]][[1]]
# [1] "A" "B" "C"
test3()
listR
# [[1]]
# [[1]][[1]]
# [1] "Z" "B" "C"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...