带有空向量的填充列表会导致其长度发生变化

eri*_*eld 6 r vector

在下面的代码中,我期待长度为96的东西,但我得到一个长度为48的列表.你能解释一下这个结果吗?

num_empty = 96
empty_vecs = as.list(1:num_empty)
for(i in 1:num_empty){empty_vecs[[i]] = c()}
length(empty_vecs)

[1] 48
Run Code Online (Sandbox Code Playgroud)

现在我将回答导致我遇到这种行为的问题.最初的问题是,"如何在R中列出空载体?" 得到的回答是"替换c()character()在上面的代码."

jos*_*ber 8

设置等于c()(aka NULL)的列表元素将删除它们,因此该循环具有删除列表中的每个其他元素的效果.要看到这一点,请考虑一个较小的示例,迭代打印出结果向量:

e <- list(1, 2, 3, 4)
e
# [[1]]
# [1] 1
# 
# [[2]]
# [1] 2
# 
# [[3]]
# [1] 3
# 
# [[4]]
# [1] 4
# 
e[[1]] <- c()
e
# [[1]]
# [1] 2
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 4
# 
e[[2]] <- c()
e
# [[1]]
# [1] 2
# 
# [[2]]
# [1] 4

e[[3]] <- c()
e
# [[1]]
# [1] 2
# 
# [[2]]
# [1] 4

e[[4]] <- c()
e
# [[1]]
# [1] 2
# 
# [[2]]
# [1] 4
Run Code Online (Sandbox Code Playgroud)

请注意,如果您确实想要创建96个NULL值的列表,则可以尝试:

replicate(96, c(), FALSE)
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法是:`rep(list(NULL), 96)` (2认同)
  • 我可能会更清楚地说`c()`是一个在输出中没有传递参数时返回`NULL`的函数.`c()`不是每个人都认为的"向量"函数.它用于连接向量.`c()`不会以`character()`或`numeric()`的方式创建空向量. (2认同)
  • 至于为什么删除 - 来自`?"[["`:"请注意,在所有三种替换中,值'NULL'删除列表的相应项." (2认同)