Функция R cpp вылетает из RStudio при упаковке - PullRequest
3 голосов
/ 28 мая 2020

Я создал фиктивный пакет R cpp, используя Rcpp.package.skeleton(myPackage) с единственной функцией:

// [[Rcpp::export]]
double triple_balance(const double& balance) {

  if(R_IsNA(balance)) {
    stop("balance is NA, please provide a numeric value");
  } else {
     double result = balance*3;
    return result;
  }
}

В модульных тестах я хочу убедиться, что функция возвращает ошибку при неправильном вводе. прошло, что он постоянно делает, если я его использую:

Rcpp::sourceCpp('src/triple_balance.cpp')
triple_balance("10")

Ошибка в triple_balance («10»): Несовместимо с запрошенным типом: [type = character; target = double].

Однако, если я устанавливаю и перезапускаю пакет, запуск triple_balance("10") приводит к сбою RStudio. Я должен добавить, что cra sh не происходит каждый раз и, похоже, зависит от начального состояния библиотеки, например, устанавливал ли я предыдущие версии пакета раньше, например, с const в определении функции или без него. .

Чем объясняется такое непоследовательное поведение?

Мой sessionInfo:

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server 7.8 (Maipo)

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rcppDummy_1.0

loaded via a namespace (and not attached):
[1] compiler_3.6.0 tools_3.6.0    Rcpp_1.0.2     packrat_0.5.0 

1 Ответ

5 голосов
/ 28 мая 2020

В случае использования

Rcpp::sourceCpp('src/triple_balance.cpp')
triple_balance("10")

ошибка ваша, потому что пока ваш интерфейс использует double

double triple_balance(const double& balance)

, это не то, что вы предоставляете когда вы набираете "10" - это вектор символов (или «строка»)!

Вы можете поймать это автоматически МАГИЧЕСКИ с помощью R cpp, если вы используете векторные аргументы:

// [[Rcpp::export]]
NumericVector triple_balance(const NumericVector & balance) {
    return balance * 3;
}

Это теперь проверяет, когда создается структура данных R cpp:

R> triple_balance(10)
[1] 30
R> triple_balance(10L)
[1] 30
R> triple_balance("10")
Error in triple_balance("10") : 
  Not compatible with requested type: [type=character; target=double].
R> 

Лучше всего то, что он автоматически работает с векторами:

R> triple_balance(c(c(2,3), seq(10,30,by=10), log10(1:3)))
[1]  6.00000  9.00000 30.00000 60.00000 90.00000  0.00000  0.90309  1.43136
R> 

, а также обрабатывает неконечные значения:

R> triple_balance(c(10, NA, NaN, Inf, -Inf))
[1]   30   NA  NaN  Inf -Inf
R> 

Редактировать Автор кстати, если я сохраню вашу версию в исходном файле с добавлением _orig, она отлично подойдет и для меня (Ubuntu 20.04; текущий R cpp)

R> triple_balance_orig("10")
Error in triple_balance_orig("10") : 
  Not compatible with requested type: [type=character; target=double].
R> packageVersion("Rcpp")
[1] ‘1.0.4.11’
R> 

Это поведение не является новым кодом , поэтому я немного удивлен, что это приводит к сбою вашей установки RHEL.

Edit 2: Ради аргумента, я также сделал это в пакете, и это тоже не приводит к отключению RStudio. У меня самая последняя тестовая версия 1.4.390. (Я видел такую ​​хрень sh при повторной компиляции пакетов и ошибок, это может произойти. Здесь этого не должно происходить.)

Вы можете попробовать свой код в https://rstudio.cloud чтобы быстро попробовать другую среду.

...