为R中的列表元素分配NULL?

我发现这种行为很奇怪,并希望更有经验的用户分享他们的想法和解决方法。
运行下面的代码示例在R:

sampleList <- list()
d<- data.frame(x1=letters[1:10],x2=1:10,stringsAsFactors=FALSE)
for(i in 1:nrow(d))
        sampleList[[i]] <- d$x1[i]

print(sampleList[[1]])
print(sampleList[[2]])
print(sampleList[[3]])
print(length(sampleList))
sampleList[[2]] <- NULL
print(length(sampleList))
print(sampleList[[2]])
print(sampleList[[3]])

列表元素被向上移动。
也许这是预期的,但我试图实现一个函数,其中我合并列表的两个元素,并放下一个。我基本上想丢失列表索引或将其作为NULL。

有没有任何方式,我可以分配NULL到它,没有看到上述行为?

谢谢你的建议。

好问题。

查看R-FAQ

In R, if x is a list, then x[i] <- NULL and x[[i]] <- NULL remove the specified elements from x. The first of these is incompatible with S, where it is a no-op. (Note that you can set elements to NULL using x[i] <- list(NULL).)

请考虑以下示例:

> t <- list(1,2,3,4)
> t[[3]] <- NULL          # removing 3'd element (with following shifting)
> t[2] <- list(NULL)      # setting 2'd element to NULL.
> t
[[1]]
[2] 1

[[2]]
NULL

[[3]]
[3] 4

更新:

正如the R Inferno的作者所言,在处理NULL时可能有更微妙的情况。考虑相当一般的代码结构:

# x is some list(), now we want to process it.
> for (i in 1:n) x[[i]] <- some_function(...)

现在要注意,如果some_function()返回NULL,你可能不会得到你想要的:一些元素将只消失。你应该使用lapply函数。
看看这个玩具的例子:

> initial <- list(1,2,3,4)
> processed_by_for <- list(0,0,0,0)
> processed_by_lapply <- list(0,0,0,0)
> toy_function <- function(x) {if (x%%2==0) return(x) else return(NULL)}
> for (i in 1:4) processed_by_for[[i]] <- toy_function(initial[[i]])
> processed_by_lapply <- lapply(initial, toy_function)
> processed_by_for
  [[1]]
  [1] 0

  [[2]]
  [1] 2

  [[3]]
  NULL

  [[4]]
  [1] 4

> processed_by_lapply
  [[1]]
  NULL

  [[2]]
  [1] 2

  [[3]]
  NULL

  [[4]]
  [1] 4
http://stackoverflow.com/questions/7944809/assigning-null-to-a-list-element-in-r

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为R中的列表元素分配NULL?