Як пашырыць спіс нулямі да некаторай даўжыні?

Given a list whose length <= N, what is the best/most efficient way to fill it up with trailing NULLs up to length (so that it has length N).

Гэта тое, што адзін укладыш у любым прыстойным мове, але я паняцця не маю, як гэта зрабіць (эфектыўна) у некалькі радкоў у R, так што ён працуе на кожным куце корпуса (нулявы даўжыні спісу і г.д.) ,

3

6 адказы

Давайце трымаць яго вельмі проста:

tst<-1:10 #whatever, to get a vector of length 10
tst<-tst[1:15]
7
дададзена
Вось і ўсё. Гэта рашэнне 2 разоў хутчэй, чым чым адзін прапанаваны Мэцью Dowle, і ў 5 разоў хутчэй, чым маё нязграбным рашэнне.
дададзена аўтар eold, крыніца
Так, гэта яшчэ хутчэй для вялікіх спісаў. Дзякуючы.
дададзена аўтар eold, крыніца
@leden. Яшчэ адзін спосаб проста даўжыня (ТСТ) = 15 . Усё хутчэй? Як вы правяраеце?
дададзена аўтар Matt Dowle, крыніца
Як гэта спіс? :)
дададзена аўтар Roman Luštrik, крыніца
Даволі справядліва. :)
дададзена аўтар Roman Luštrik, крыніца
@ RomanLuštrik: гм. На шчасце, ён таксама працуе для TST <-list (1,2,3) . Але, вядома ж, спіс з'яўляецца толькі прыватным выпадкам вэктару, таму я думаў, што забяспечыць больш агульнае рашэнне. <�Кашаль />
дададзена аўтар Nick Sabbe, крыніца

Паспрабуйце гэта:

> 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

>
6
дададзена

Як наконт гэтага?

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

[[2]]
[1] 1 2 3

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL
5
дададзена

Непасрэдна рэдагуючы даўжыню спісу, як уяўляецца, быць самым хуткім, наколькі я магу сказаць:

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

Але гэтыя адрозненні не гэтак вялікія, калі вы робіце гэта шмат на вельмі доўгія спісах, я мяркую.

4
дададзена

Я ўпэўнены, што ёсць больш кароткія шляху, але я быў бы схільны рабіць:

l <- as.list(1:10)
N <- 15
l <- c(l, as.list(rep(NA, N - length(l) )))
1
дададзена

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

length <- 10
temp <- list("a","b")
print(temp)
temp[length] <- NULL
print(temp)
0
дададзена