diff --git a/R/as.data.table.R b/R/as.data.table.R index f849aa8c1..5b4dea697 100644 --- a/R/as.data.table.R +++ b/R/as.data.table.R @@ -102,8 +102,9 @@ as.data.table.array = function(x, keep.rownames=FALSE, key=NULL, sorted=TRUE, va lapply(dx, seq_len) } else if (any(nulldnx <- vapply_1b(dnx, is.null))) { dnx[nulldnx] = lapply(dx[nulldnx], seq_len) #3636 + setattr(dnx, 'names', copy(names(dnx))) dnx - } else dnx + } else copy(dnx) setfrev(val) if (is.null(names(val)) || !any(nzchar(names(val)))) setattr(val, 'names', paste0("V", frev(seq_along(val)))) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index b9d9a3ba5..46189a890 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21921,3 +21921,14 @@ rm(DTn, DTl, DT) DT = unserialize(serialize(as.data.table(mtcars), NULL)) test(2353, DT[,foo:=mean(mpg),by=cyl], as.data.table(mtcars)[,foo:=mean(mpg),by=cyl]) rm(DT) + +# as.data.table.array(x) shouldn't overwrite dimnames(x), #7506 +Xdn = list(foo = letters[1:2], bar = LETTERS[1:3], baz = as.character(1:4)) +X = array(1:24, 2:4, copy(Xdn)) +DT = as.data.table(X) +test(2354.1, dimnames(X), Xdn) +Xdn['baz'] = list(NULL) +dimnames(X) = copy(Xdn) +DT = as.data.table(X) +test(2354.2, dimnames(X), Xdn) +rm(X, Xdn, DT)