我想在循环中向列表添加元素(我不确切知道多少)
像这样:
l <- list();
while(...)
l <- new_element(...);
Run Code Online (Sandbox Code Playgroud)
最后,l[1]将是我的第一个元素,l[2]我的第二个元素,依此类推.
你知道怎么办吗?
我有问题将数据附加到已经是列表格式的列表中.我有一个程序,它将在模拟循环中导出结果对象.数据本身存储为矩阵列表.我的想法是将这些列表存储在一个列表中,然后将这个列表列表保存为R对象以供以后分析,但是我遇到了一些正确的问题.我将使用值而不是模拟中的矩阵数据来展示我用小抽象示例所做的事情:
假设我已经运行了3次模拟循环.在迭代期间,结果列表需要收集到我将保存为R对象的列表列表中:
列表包含其他列表并保存:
outlist1 <- list()
第一次迭代:
resultsa <- list(1,2,3,4,5)
outlist <- append(outlist1,resultsa)
第二次迭代:
resultsb <- list(6,7,8,9,10)
outlist <- append(outlist1,b)
第三次迭代:
resultsc <- list(11,12,13,14,15)
outlist <- list(outlist2,c)
但是,此解决方案不适用于以这种方式增长包含列表的列表,所需的结果是:
>outlist
[[1]]
[[1]][[1]]
[1] 1
[[1]][[2]]
[1] 2
[[1]][[3]]
[1] 3
[[1]][[4]]
[1] 4
[[1]][[5]]
[1] 5
[[2]]
[[2]][[1]]
[1] 6
[[2]][[2]]
[1] 7
[[2]][[3]]
[1] 8
[[2]][[4]]
[1] 9
[[2]][[5]]
[1] 10
[[3]]
[[3]][[1]]
[1] 11
[[3]][[2]]
[1] 12
[[3]][[3]]
[1] 13
[[3]][[4]]
[1] 14
[[3]][[5]]
[1] 15
Run Code Online (Sandbox Code Playgroud)
但是,我得到的是:
> outlist3 …Run Code Online (Sandbox Code Playgroud) > list1 <- list("foo", pi)
> bar <- list("A", "B")
Run Code Online (Sandbox Code Playgroud)
我怎么能新元素追加bar到list1?显然,c()不起作用,它变平bar:
> c(list1, bar)
[[1]]
[1] "foo"
[[2]]
[1] 3.141593
[[3]]
[1] "A"
[[4]]
[1] "B"
Run Code Online (Sandbox Code Playgroud)
索引作业的分配:
> list1[[length(list1)+1]] <- bar
> list1
[[1]]
[1] "foo"
[[2]]
[1] 3.141593
[[3]]
[[3]][[1]]
[1] "A"
[[3]][[2]]
[1] "B"
Run Code Online (Sandbox Code Playgroud)
这种方法的效率是多少?有更优雅的方式吗?
这是非常基本的,但我似乎无法弄明白
假设我有一个变量条目列表:
lst <- list(a=1:4, b=rep('k', 5), c=3)
Run Code Online (Sandbox Code Playgroud)
如果我想用指定的名称添加一个向量,我应该能够通过以下方式这样做:
c(f=1:5, lst)
Run Code Online (Sandbox Code Playgroud)
但是不是创建一个名为'f'的条目,包含1 2 3 4 5,而是创建五个条目(f1-f5),每个条目包含一个数字.
我该如何抑制这种行为?
我知道我可以使用
lst$f <- 1:5
Run Code Online (Sandbox Code Playgroud)
但我想在函数调用中附加列表...
我试图并行化一些html文档中保存的数据的提取并将其存储到data.frames(数百万个文档,因此并行化的有用性).
在第一步,在我注册队列的机器上,我选择html文件的一个子集并向他们提供read_html函数(从rvest包中,我也尝试了XML包中的类似函数但是我是获取内存泄漏问题)获取存储许多html页面内容的唯一列表.
然后我在这个列表中使用一个迭代器来获取它的较小块以供给foreach.
在foreach中,我构建了data.frame(s)(使用html_table函数和一些基本的数据操作),然后返回一个列表,其元素是已清理的data.frames.
我试图在win 8上使用doSNOW后端,在ubuntu 16.04上使用doRedis后端.
在第一种情况下,返回空列表的列表,而在第二种情况下,抛出内存映射的错误; 你可以在问题的最底部找到追溯.
据我所知,我发送到核心的(大块)列表不符合我的预期.我已经聚集在一起,列表对象可能只是一组指针,但我无法确认它; 也许这可能是问题?是否有"列表方式"替代"封装"多个html页面的数据?
下面你可以找到一些复制问题的代码.我是一个全新的堆栈溢出,新的并行编程和R编程的新手:任何改进的建议都是受欢迎的.谢谢大家.
library(rvest)
library(foreach)
#wikipedia pages of olympic medalist between 1992 and 2016 are
# downloaded for reproducibility
for(i in seq(1992, 2016, by=4)){
html = paste("https://en.wikipedia.org/wiki/List_of_", i, "_Summer_Olympics_medal_winners", sep="")
con = url(html)
htmlCode = readLines(con)
writeLines(htmlCode, con=paste(i, "medalists", sep="_"))
close(con)
}
#declaring the redis backend (doSNOW code is also included below)
#note that I am using the package from
#devtools::install_github("bwlewis/doRedis") due to a "nodelay error"
#(more info on that here: …Run Code Online (Sandbox Code Playgroud) 从数据库游标中读取记录时,通常会提前知道有多少行.这使得无法预先分配正确大小的列表来存储这些对象.
当我们总大小未知时,将所有记录存储在列表中的有效方法是什么?基本列表类型很慢,因为每次附加元素时它都会复制整个列表:
x <- list()
for(i in 1:1e5){
x[[i]] <- list("foo" = rnorm(3), bar = TRUE)
}
Run Code Online (Sandbox Code Playgroud)
环境更有效,但它是地图而不是有序集.所以我们需要将索引转换为字符串,然后对键进行排序以检索值,这似乎不是最理想的:
env <- new.env()
for(i in 1:1e5){
env[[sprintf("%09d", i)]] <- list("foo" = rnorm(3), bar = TRUE)
}
x <- lapply(sort(ls(env)), get, env, inherits = FALSE)
Run Code Online (Sandbox Code Playgroud)
A pairlist应该是R中的链表,但是只要从R中追加一个元素,R就会将它强行插入到常规列表中.
是否可以从列表中创建省略号(...)?我的想法是能够做到这样的事情:
mylist <- list(a=1,b=2,c=3)
myellipsis <- create_ellipsis(mylist)
print(switch('a', myellipsis)) # output 1
Run Code Online (Sandbox Code Playgroud) 这个问题与之前的问题相关,但那里的答案(使用c()函数)正是对我不起作用的。
首先,我创建一个向量列表,然后创建一个附加向量。
a_list <- lapply(mtcars, as.integer)
junk <- c(1:length(a_list[[1]]))
Run Code Online (Sandbox Code Playgroud)
现在,如果使用c(a_list, junk)(如前面问题的答案中所建议的那样),我会得到一个与我所说的完全不同的答案a_list[["junk"]] <- junk(后者产生所需的结果)。似乎前一种方法添加的是as.list(junk).
如何添加junkusingc()而不将其转换为 的结果as.list(junk)?