Rcpp:更改列表列表中的列表项
Rcpp: change a list item in a list of a list
更改列表列表中的列表项。
很遗憾,我无法在论坛中找到问题的答案。
使用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";
}
如果有人能帮助我就太好了。
非常感谢:)
我发现您发布的一些代码很难理解,但这是一个相当简单的任务,无论是在您第一次尝试时以硬编码方式从 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"
更改列表列表中的列表项。
很遗憾,我无法在论坛中找到问题的答案。
使用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";
}
如果有人能帮助我就太好了。
非常感谢:)
我发现您发布的一些代码很难理解,但这是一个相当简单的任务,无论是在您第一次尝试时以硬编码方式从 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"