R: Использование таблицы данных в моем собственном пакете: ошибка в lapply (.SD, среднее): объект '.SD' не найден - PullRequest
1 голос
/ 09 апреля 2020

В ответ на этот вопрос я создал свой собственный пакет, в котором используется 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 файл AND import(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 содержит data.table в разделе Imports, а файл NAMESPACE содержит import(data.table).

В * есть только одна функция с именем aggregate_mean Файл 1061 * внутри папки 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 Ответ

4 голосов
/ 12 апреля 2020

Поскольку в вашем вопросе есть воспроизводимый пример, я смог в нем разобраться.

Я скачал 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

Так что я не могу воспроизвести вашу проблему. Я рекомендую вам выполнить те же действия, как описано выше, чтобы сузить круг вопросов, если проблема заключается в том, как установить пакет. Если у вас есть дополнительные вопросы, а не редактирующие вопросы, лучше всего поместить их в комментарии под моим ответом.

Надеюсь, это поможет!

...