R:在我自己的程序包中使用数据表:lapply(.SD,Mean)错误:未找到对象“ .SD”

时间:2020-04-09 11:18:57

标签: r data.table package

this question之后,我构建了自己的软件包,该软件包使用了data.table

在包中,我使用data.table来根据另一列计算矩阵中每列的均值。

以下内容:

datam <- cbind(matrix(rexp(100), 10), IN=c(rep(1,2), rep(2,3), rep(3,2), rep(4,1), rep(5,2)))
dd <- data.table::data.table(datam)
result <- dd[, lapply(.SD, mean), by=IN]

要使其正常工作,唯一的方法是在data.table文件的Depends:字段中包含DESCRIPTION,在import(data.table)文件中包含NAMESPACE。 / p>

现在,我希望能够从使用data.table的程序包中调用该函数,如下所示:

mypackage::myfunction(...)

但是,出现以下错误:

lapply(.SD,均值)错误:找不到对象'.SD'

仅当我使用library()加载程序包后调用函数时,此错误才会消失,如下所示:

library(mypackage)
myfunction(...)

由于我的程序包随后会从其他程序包中调用,是否有一种方法可以使我的程序运行而不必每次都使用library(),就像我需要使用其他函数的其他程序包一样? 谢谢

编辑

我刚刚制作了一个MWE程序包,可重现该错误。请从下面的Google云端硬盘链接下载:

https://drive.google.com/open?id=1yHxmQeoIOx9VIuL4EBrFWlGDBstnKJQs

我使用usethis软件包在usethis_myexample.R文件中进行了构建。

该软件包本身称为myexample,包含在myexample-package文件夹中。在其中,您可以在DESCRIPTION部分中看到data.table文件包含Imports,而NAMESPACE文件包含import(data.table)

R文件夹内aggregate_mean文件中只有一个名为functions.R的函数。

myexample-package文件夹旁边,有一个tests文件夹,其中包含一个名为mytest.R的测试文件,用于运行aggregate_mean函数,如下所示:

mymat <- cbind(matrix(rexp(100), 10), IN=c(rep(1,2), rep(2,3), rep(3,2), rep(4,1), rep(5,2)))
mymat
mynewmat <- myexample::aggregate_mean(mymat, "IN")
mynewmat

我总是遇到错误:

lapply(.SD,均值)错误:找不到对象'.SD'

谢谢!

1 个答案:

答案 0 :(得分:4)

由于您的问题中现在有一个可重复的实例,所以我能够对其进行深入研究。

我从您的链接下载了zip文件,将其解压缩,将myexample-package重命名为mypackage。然后...

R CMD build myexample
R CMD INSTALL myexample_0.0.0.9000.tar.gz
R -q

然后在R。

mymat <- cbind(matrix(rexp(100), 10), IN=c(rep(1,2), rep(2,3), rep(3,2), rep(4,1), rep(5,2)))
mymat                                                                  
# [1,] 0.83010264 0.4778802 1.15826121 0.304299143 0.5781483 1.81660550
# [2,] 0.03895798 2.3709480 0.69694839 0.730800823 0.3319984 0.53348461
# [3,] 0.03383199 0.2842029 1.74151827 1.019573035 0.1863635 0.89487309
# [4,] 0.53533254 0.2814782 0.78563371 0.309180422 1.4393098 1.07450638
# [5,] 0.53010142 1.3132409 0.67072292 1.212244007 0.1984360 0.06208641
# [6,] 0.45916016 0.5576434 0.67770401 0.056270575 0.5065829 0.83416626
# [7,] 0.25404953 0.2730706 0.01070633 0.132406274 1.6186573 0.37083771
# [8,] 3.42254715 0.6489950 0.81291881 0.003048744 1.3522848 0.18066361
# [9,] 1.29994319 0.3170614 1.71145805 1.141222719 1.1832478 0.18091907
#[10,] 0.23622615 0.4473482 3.07774816 1.441207092 0.9761152 0.28132707
#                                                IN
# [1,] 6.1868517 2.44880203 0.55261438 0.3459453  1
# [2,] 0.8177218 0.90554629 1.00106158 1.0427756  1
# [3,] 4.3910329 0.56068780 0.24262243 1.7036666  2
# [4,] 0.8712083 0.02439399 0.80927766 1.6596570  2
# [5,] 0.6613734 0.12954737 1.01661648 1.2446795  2
# [6,] 0.2858442 2.32610958 0.26553789 0.4856818  3
# [7,] 3.6628536 0.26447698 0.70633274 2.0283399  3
# [8,] 0.0515666 0.99916985 0.06102821 0.9413485  4
# [9,] 4.7781407 1.47764414 1.92598562 0.4581395  5
#[10,] 0.8770661 2.78552022 0.07543095 0.6886183  5
mynewmat <- myexample::aggregate_mean(mymat, "IN")
mynewmat
#   get        V1        V2        V3          V4        V5        V6        V7
#1:   1 0.4345303 1.4244141 0.9276048 0.517549983 0.4550734 1.1750451 3.5022868
#2:   2 0.3664220 0.6263073 1.0659583 0.846999155 0.6080364 0.6771553 1.9745382
#3:   3 0.3566048 0.4153570 0.3442052 0.094338425 1.0626201 0.6025020 1.9743489
#4:   4 3.4225471 0.6489950 0.8129188 0.003048744 1.3522848 0.1806636 0.0515666
#5:   5 0.7680847 0.3822048 2.3946031 1.291214905 1.0796815 0.2311231 2.8276034
#          V8         V9       V10 IN
#1: 1.6771742 0.77683798 0.6943604  1
#2: 0.2382097 0.68950553 1.5360010  2
#3: 1.2952933 0.48593531 1.2570109  3
#4: 0.9991699 0.06102821 0.9413485  4
#5: 2.1315822 1.00070829 0.5733789  5

所以我无法重现您的问题。如果问题出在安装软件包的方式中,则建议您按照上述相同的步骤进行操作,以缩小范围。 如果您还有其他跟进问题,而不是编辑问题,最好在我的答案下加上注释。

希望有帮助!