【问题标题】:R: Using data table inside my own package: Error in lapply(.SD, mean) : object '.SD' not foundR:在我自己的包中使用数据表:lapply(.SD,mean)中的错误:找不到对象'.SD'
【发布时间】:2020-04-09 11:18:57
【问题描述】:

跟进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]

我让它工作的唯一方法是在我的DESCRIPTION 文件的Depends: 字段中包含data.tableimport(data.table)NAMESPACE 文件中。

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

mypackage::myfunction(...)

但是,我收到以下错误:

lapply 中的错误(.SD,平均值):找不到对象“.SD”

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

library(mypackage)
myfunction(...)

由于我的包随后会从其他包中调用,有没有一种方法可以让它工作而不必每次都使用library(),就像我对需要函数的每个其他包所做的那样? 谢谢

编辑

我刚刚制作了一个 MWE 包来重现错误。请从下面的 Google Drive 链接下载:

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

我使用usethis 包构建它,在usethis_myexample.R 文件中。

包本身称为myexample,包含在myexample-package 文件夹中。在里面你可以看到DESCRIPTION文件在Imports部分包含data.tableNAMESPACE文件包含import(data.table)

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

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”

谢谢!

【问题讨论】:

  • 你可以从data.tableimport.SD
  • 让我试试...但我已经做了import(data.table),它应该导入所有data.table 函数...我不应该在上面做importFrom(data.table, .SD) 对吗?
  • 不,但我从你的问题中了解到你不喜欢 import(data.table) 和 Depends: data.table
  • NAMESPACE 文件中使用import(data.table) 和在DESCRIPTION 文件中使用Imports: data.table 就足够了

标签: r data.table package


【解决方案1】:

由于您的问题现在有一个可重复的例子,我能够深入研究它。

我从您的链接下载了 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

所以我无法重现您的问题。如果问题出在安装软件包的方式上,我鼓励您按照上述相同的步骤来缩小范围。 如果您有更多后续问题,而不是编辑问题,最好将它们放在我的回答下的 cmets 中。

希望有帮助!

【讨论】:

  • 哦,真的吗?按原样使用我的包裹,您没有收到错误消息吗?我使用 RStudio 构建和安装,有什么不同吗?
  • @DaniCee 是的,它有所作为。 RStudio 是 R 的接口。
  • 在使用data.table的时候,是不是不鼓励用Rstudio建一个包?
  • 不知道。我确实将 RStudio 与 data.table 一起使用,但现在我不使用它来构建包,而只是编辑代码。过去,我在构建与 data.table 无关的包时遇到了多个不同的问题,这浪费了我足够多的时间来不再尝试。
  • 我不使用 .Rproj 文件,它们不是 R 的一部分,R 不会以任何方式使用它们。它们仅由 RStudio 使用(或者可能是一些 rstudio 包,如 usethis、devtools 等)。
【解决方案2】:

Imports: data.table 添加到您的包描述中,并在您的包的 R 文件中的某处声明.datatable.aware &lt;- TRUE

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 2011-07-28
    • 1970-01-01
    • 2020-11-22
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多