Как расширить список с NULL до некоторой длины? - PullRequest
3 голосов
/ 11 ноября 2011

Учитывая список, длина которого <= N, каков наилучший / самый эффективный способ заполнить его конечными значениями NULL s (так, чтобы он имел длину N).

Этоэто то, что является однострочным в любом приличном языке, но я понятия не имею, как это сделать (эффективно) в несколько строк в R, чтобы это работало для каждого углового случая (список нулевой длины и т. д.).

Ответы [ 6 ]

7 голосов
/ 11 ноября 2011

Давайте сделаем это по-настоящему простым:

tst<-1:10 #whatever, to get a vector of length 10
tst<-tst[1:15]
6 голосов
/ 11 ноября 2011

Попробуйте это:

> l = list("a",1:3)
> N = 5
> l[N+1]=NULL
> l
[[1]]
[1] "a"

[[2]]
[1] 1 2 3

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

>
5 голосов
/ 12 ноября 2011

Как насчет этого?

> l = list("a",1:3)
> length(l)=5
> l
[[1]]
[1] "a"

[[2]]
[1] 1 2 3

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL
4 голосов
/ 12 ноября 2011

Насколько я могу судить, непосредственное редактирование длины списка кажется самым быстрым:

tmp <- vector("list",5000)
sol1 <- function(x){
    x <- x[1:10000] 
}
sol2 <- function(x){
    x[10001] <- NULL
}
sol3 <- function(x){
    length(x) <- 10000
}

library(rbenchmark)
benchmark(sol1(tmp),sol2(tmp),sol3(tmp),replications = 5000)
       test replications elapsed relative user.self sys.self user.child sys.child
1 sol1(tmp)         5000   2.045 1.394952     1.327    0.727          0         0
2 sol2(tmp)         5000   2.849 1.943383     1.804    1.075          0         0
3 sol3(tmp)         5000   1.466 1.000000     0.937    0.548          0         0

Но различия невелики, если вы не делаете это много в очень длинных списках,Я полагаю.

1 голос
/ 11 ноября 2011

Я уверен, что есть более короткие пути, но я был бы склонен сделать:

l <- as.list(1:10)
N <- 15
l <- c(l, as.list(rep(NA, N - length(l) )))
0 голосов
/ 11 ноября 2011

Привет: Я не уверен, что вы говорили о фактическом списке, но, если вы были, ниже будет работать.Это работает, потому что, как только вы получаете доступ к элементу вектора (который является списком), которого там нет, R расширяет вектор до этой длины.

length <- 10
temp <- list("a","b")
print(temp)
temp[length] <- NULL
print(temp)
...