将 data.table 列的子集传递给函数并通过引用将结果添加回 R

Passing subset of data.table columns to a function and adding the result back by reference in R

我有一个data.table如下-

library(data.table)
library(quantmod)
dataTableTemp <- getSymbols('AAPL', auto.assign = FALSE)
dt = data.table("date" = index(dataTableTemp), coredata(dataTableTemp))
> dt
            date  AAPL.Open  AAPL.High   AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
   1: 2007-01-03   3.081786   3.092143   2.925000   2.992857  1238319600      2.581790
   2: 2007-01-04   3.001786   3.069643   2.993571   3.059286   847260400      2.639095
   3: 2007-01-05   3.063214   3.078571   3.014286   3.037500   834741600      2.620301
   4: 2007-01-08   3.070000   3.090357   3.045714   3.052500   797106800      2.633241
   5: 2007-01-09   3.087500   3.320714   3.041071   3.306071  3349298400      2.851985
  ---                                                                                 
3542: 2021-01-27 143.429993 144.300003 140.410004 142.059998   140843800    142.059998
3543: 2021-01-28 139.520004 141.990005 136.699997 137.089996   142621100    137.089996
3544: 2021-01-29 135.830002 136.740005 130.210007 131.960007   177180600    131.960007
3545: 2021-02-01 133.750000 135.380005 130.929993 134.139999   106239800    134.139999
3546: 2021-02-02 135.729996 136.309998 134.610001 134.990005    82919600    134.990005

对于这个 data.table,我想添加一些由 TTR::ADX 函数返回的列

我试过类似的东西 -

dt[, c("DIp", "DIn", "DX", "ADX") := ADX(.SD, n = 14), .SDcols = c("AAPL.High", "AAPL.Low", "AAPL.Close")]

但是,我收到错误消息:

Error in `[.data.table`(x, , `:=`(c("DIp", "DIn", "DX", "ADX"), ADX(.SD,  : 
  Supplied 14184 items to be assigned to 3546 items of column 'DIp'.

期待有关如何解决此问题的建议。

谢谢。

ADX 的输出是 matrix。我们可以将其转换为 data.framedata.table,它应该可以工作

library(data.table)
dt[, c("DIp", "DIn", "DX", "ADX") := as.data.table(ADX(.SD, n = 14)), 
    .SDcols = c("AAPL.High", "AAPL.Low", "AAPL.Close")]

-输出

tail(dt)
         date AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted      DIp      DIn         DX      ADX
1: 2021-01-26    143.60    144.30   141.37     143.16    98390600        143.16 35.49876 13.80000 44.0148053 20.06051
2: 2021-01-27    143.43    144.30   140.41     142.06   140843800        142.06 33.04946 14.55058 38.8631656 21.40356
3: 2021-01-28    139.52    141.99   136.70     137.09   142621100        137.09 29.98002 19.62764 20.8685020 21.36534
4: 2021-01-29    135.83    136.74   130.21     131.96   177180600        131.96 26.56904 28.12707  2.8485164 20.04271
5: 2021-02-01    133.75    135.38   130.93     134.14   106239800        134.14 24.61803 26.06165  2.8485164 18.81455
6: 2021-02-02    135.73    136.31   134.61     134.99    82919600        134.99 25.29525 25.09397  0.3994657 17.49919