Data.table: рдХреНрдпреЛрдВ data.table рд╕реВрдЪреА рдХреЙрд▓рдо рд╕рдмрд╕реЗрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡реЗрдХреНрдЯрд░рдХреГрдд рдХреЙрд▓рдо рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рддреЗрдЬ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдорд╛рд░реНрдЪ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Rdatatable/data.table

рдореБрдЭреЗ рдпрд╣ data.table рд╕рд╛рдорд╛рди рдкрд╕рдВрдж рд╣реИ, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреЗ рдЕрдкрдиреЗ рдкрд╛рд░рд┐рд╢реНрд░рдорд┐рдХ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдПред
рдореИрдВ рдЗрд╕реЗ рдЫреЛрдЯреА рдЯреЗрдмрд▓ рдкрд░ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВред
рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдмрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ: DT[, .(id1, id5)]
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ: DT[, c("id1", "id5")]

рдЖрдЬ рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рдХреА рдЧрддрд┐ рдорд╛рдкреА рдФрд░ рдЫреЛрдЯреА рдореЗрдЬреЛрдВ рдкрд░ рдЧрддрд┐ рдХреЗ рдЕрдВрддрд░ рд╕реЗ рдЪрдХрд┐рдд рд╣реЛ рдЧрдпрд╛ред рдкрд╛рд░рд╕реАрдореЛрдирд┐рдпрд╕ рддрд░реАрдХрд╛ рд░рд╛рд╕реНрддрд╛ рдзреАрдорд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд░ рдХреБрдЫ рдЗрд░рд╛рджрд╛ рд╣реИ?

рдХреНрдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд░ рддрд░реАрдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрдХрд╛рдВрдХреНрд╖рд╛ рд╣реИ?
(рдпрд╣ рддрдм рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ рдХрдИ рдЫреЛрдЯреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдмрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред)

рдЙрдмрдВрдЯреВ 18.04
рдЖрд░ рд╕рдВрд╕реНрдХрд░рдг 3.5.3 (2019-03-11)
рдбреЗрдЯрд╛.рдЯреЗрдмрд▓ 1.12.0
рд░реИрдо 32GB
Intel┬о CoreтДв i7-8565U CPU @ 1.80GHz ├Ч 8

library(data.table)
library(microbenchmark)
N  <- 2e8
K  <- 100
set.seed(1)
DT <- data.table(
  id1 = sample(sprintf("id%03d", 1:K), N, TRUE),               # large groups (char)
  id2 = sample(sprintf("id%03d", 1:K), N, TRUE),               # large groups (char)
  id3 = sample(sprintf("id%010d", 1:(N/K)), N, TRUE),       # small groups (char)
  id4 = sample(K,   N, TRUE),                                           # large groups (int)
  id5 = sample(K,   N, TRUE),                                           # large groups (int)
  id6 = sample(N/K, N, TRUE),                                          # small groups (int)
  v1 =  sample(5,   N, TRUE),                                           # int in range [1,5]
  v2 =  sample(5,   N, TRUE),                                           # int in range [1,5]
  v3 =  sample(round(runif(100, max = 100), 4), N, TRUE) # numeric e.g. 23.5749
)

microbenchmark(
  DT[, .(id1, id5)],
  DT[, c("id1", "id5")]
)
Unit: seconds
                  expr      min       lq     mean   median       uq      max neval
     DT[, .(id1, id5)] 1.588367 1.614645 1.929348 1.626847 1.659698 12.33872   100
 DT[, c("id1", "id5")] 1.592154 1.613800 1.937548 1.628082 2.184456 11.74581   100


N  <- 2e5
DT2 <- data.table(
  id1 = sample(sprintf("id%03d", 1:K), N, TRUE),                 # large groups (char)
  id2 = sample(sprintf("id%03d", 1:K), N, TRUE),                 # large groups (char)
  id3 = sample(sprintf("id%010d", 1:(N/K)), N, TRUE),         # small groups (char)
  id4 = sample(K,   N, TRUE),                                             # large groups (int)
  id5 = sample(K,   N, TRUE),                                             # large groups (int)
  id6 = sample(N/K, N, TRUE),                                            # small groups (int)
  v1 =  sample(5,   N, TRUE),                                             # int in range [1,5]
  v2 =  sample(5,   N, TRUE),                                             # int in range [1,5]
  v3 =  sample(round(runif(100, max = 100), 4), N, TRUE)   # numeric e.g. 23.5749
)

microbenchmark(
  DT2[, .(id1, id5)],
  DT2[, c("id1", "id5")]
)
Unit: microseconds
                   expr      min       lq      mean    median        uq      max neval
DT2[, .(id1, id5)] 1405.042 1461.561 1525.5314 1491.7885 1527.8955 2220.860   100
DT2[, c("id1", "id5")]  614.624  640.617  666.2426  659.0175  676.9355  906.966   100

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЖрдк рдХреЛрдб рдЪрдВрдХ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рддреАрди рдмреИрдХрдЯрд┐рдХреНрд╕ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдХреЗ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

```
code
```

рдпрд╣ рддрдм рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ рдХрдИ рдЫреЛрдЯреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдмрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рдЫреЛрдЯреА рдЯреЗрдмрд▓ рд╕реЗ рдХреЙрд▓рдо рдЪреБрдирдирд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...? рдЪреВрдВрдХрд┐ j рдореЗрдВ DT[i, j, by] рдЗрдирдкреБрдЯ рдХреА рдЗрддрдиреА рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рд╣реИред


рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) ... рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдиреНрдп рдХреЛрд▓реНрд╕ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ , DT[, setdiff(names(DT), cols) := NULL] рдФрд░ рд╕реАрдзреЗ рдбреАрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВред

рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд╕рдмрд╕реЗрдЯ рд▓реЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЙрд▓рдо рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╣рдерд┐рдпрд╛рдирд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛:

library(data.table)
library(microbenchmark)
N <- 2e8
K <- 100
set.seed(1)
DT <- data.table(
id1 = sprintf("id%03d", 1:K), # large groups (char)
id2 = sprintf("id%03d", 1:K), # large groups (char)
id3 = sprintf("id%010d", 1:(N/K)), # small groups (char)
id4 = sample(K), # large groups (int)
id5 = sample(K), # large groups (int)
id6 = sample(N/K), # small groups (int)
v1 = sample(5), # int in range [1,5]
v2 = sample(5), # int in range [1,5]
v3 = round(runif(100, max = 100), 4), # numeric e.g. 23.5749
row = seq_len(N)
)

cols = c("id1", "id5")
microbenchmark(times = 3,
  expression = DT[, .(id1, id5)],
  index = DT[, c("id1", "id5")],
  dotdot = DT[, ..cols],
  oddball = setDT(lapply(setNames(cols, cols), function(x) DT[[x]]))[],
  oddball2 = setDT(unclass(DT)[cols])[]
)

Unit: microseconds
       expr         min           lq         mean      median           uq         max neval
 expression 1249753.580 1304355.3415 1417166.9297 1358957.103 1500873.6045 1642790.106     3
      index 1184056.302 1191334.4835 1396372.3483 1198612.665 1502530.3715 1806448.078     3
     dotdot 1084521.234 1240062.2370 1439680.6980 1395603.240 1617260.4300 1838917.620     3
    oddball      92.659     171.8635     568.5317     251.068     806.4680    1361.868     3
   oddball2      66.582     125.9505     150.7337     185.319     192.8095     200.300     3

(рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рд▓рд┐рдпрд╛ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ # рдЧреБрдирд╛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдзреАрд░ рдерд╛ред)

рдореБрдЭреЗ рдЖрд░ рдХреА рд╕реВрдЪреА рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ (рдЬреЛ рдКрдкрд░ unclass рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

"рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдЧрд╛" рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ:

myDT = data.table(a = 1:2, b = 3:4)

# standard way
res <- myDT[, "a"]
res[, a := 0]
myDT
#    a b
# 1: 1 3
# 2: 2 4

# oddball, grabbing pointers
res2 <- setDT(unclass(myDT)["a"])
res2[, a := 0]
myDT
#    a b
# 1: 0 3
# 2: 0 4

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдк рдХреЛрдб рдЪрдВрдХ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рддреАрди рдмреИрдХрдЯрд┐рдХреНрд╕ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдХреЗ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

```
code
```

рдпрд╣ рддрдм рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ рдХрдИ рдЫреЛрдЯреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдмрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рдЫреЛрдЯреА рдЯреЗрдмрд▓ рд╕реЗ рдХреЙрд▓рдо рдЪреБрдирдирд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...? рдЪреВрдВрдХрд┐ j рдореЗрдВ DT[i, j, by] рдЗрдирдкреБрдЯ рдХреА рдЗрддрдиреА рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рд╣реИред


рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) ... рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдиреНрдп рдХреЛрд▓реНрд╕ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ , DT[, setdiff(names(DT), cols) := NULL] рдФрд░ рд╕реАрдзреЗ рдбреАрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВред

рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд╕рдмрд╕реЗрдЯ рд▓реЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЙрд▓рдо рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╣рдерд┐рдпрд╛рдирд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛:

library(data.table)
library(microbenchmark)
N <- 2e8
K <- 100
set.seed(1)
DT <- data.table(
id1 = sprintf("id%03d", 1:K), # large groups (char)
id2 = sprintf("id%03d", 1:K), # large groups (char)
id3 = sprintf("id%010d", 1:(N/K)), # small groups (char)
id4 = sample(K), # large groups (int)
id5 = sample(K), # large groups (int)
id6 = sample(N/K), # small groups (int)
v1 = sample(5), # int in range [1,5]
v2 = sample(5), # int in range [1,5]
v3 = round(runif(100, max = 100), 4), # numeric e.g. 23.5749
row = seq_len(N)
)

cols = c("id1", "id5")
microbenchmark(times = 3,
  expression = DT[, .(id1, id5)],
  index = DT[, c("id1", "id5")],
  dotdot = DT[, ..cols],
  oddball = setDT(lapply(setNames(cols, cols), function(x) DT[[x]]))[],
  oddball2 = setDT(unclass(DT)[cols])[]
)

Unit: microseconds
       expr         min           lq         mean      median           uq         max neval
 expression 1249753.580 1304355.3415 1417166.9297 1358957.103 1500873.6045 1642790.106     3
      index 1184056.302 1191334.4835 1396372.3483 1198612.665 1502530.3715 1806448.078     3
     dotdot 1084521.234 1240062.2370 1439680.6980 1395603.240 1617260.4300 1838917.620     3
    oddball      92.659     171.8635     568.5317     251.068     806.4680    1361.868     3
   oddball2      66.582     125.9505     150.7337     185.319     192.8095     200.300     3

(рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рд▓рд┐рдпрд╛ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ # рдЧреБрдирд╛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдзреАрд░ рдерд╛ред)

рдореБрдЭреЗ рдЖрд░ рдХреА рд╕реВрдЪреА рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ (рдЬреЛ рдКрдкрд░ unclass рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

"рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдЧрд╛" рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ:

myDT = data.table(a = 1:2, b = 3:4)

# standard way
res <- myDT[, "a"]
res[, a := 0]
myDT
#    a b
# 1: 1 3
# 2: 2 4

# oddball, grabbing pointers
res2 <- setDT(unclass(myDT)["a"])
res2[, a := 0]
myDT
#    a b
# 1: 0 3
# 2: 0 4

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдЖрдЬ рдХреБрдЫ рдирдпрд╛ рдФрд░ рддреЗрдЬ (рдСрдбрдмреЙрд▓) рд╕реАрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдкреАрдб рдФрд░ рдкрд╛рд░рд╕реАрдореЛрдирд┐рдпрд╕ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдПрдХ рдЯреНрд░реЗрдб-рдСрдл рд╣реИред рддреЛ рдЧрд┐рд▓рд╛рд╕ рдЖрдзрд╛ рднрд░рд╛ рд╣реИ! рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ #852 рд╕рдВрдмрдВрдзрд┐рдд

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mattdowle picture mattdowle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alex46015 picture alex46015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lux5 picture lux5  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MichaelChirico picture MichaelChirico  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

symbalex picture symbalex  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ