Как создать функцию, в которой, если версия R старше 3.5, выдавалось бы предупреждение?

#r

#r

Вопрос:

В настоящее время у меня есть следующий код, чтобы проверить, не равна ли текущая версия R 3.5.0. Однако я хотел бы изменить его так, чтобы, если у кого-то версия R старше 3.5.0, он выдавал предупреждение об обновлении R. Поскольку 3.5.0 не «меньше» 3.4.0 и т.д., У меня возникают проблемы с созданием логической команды, поскольку компьютер не распознает 3.4.0 как «меньше» 3.5.0. Есть ли способ облегчить это ?

 if(strsplit(version[['version.string']], ' ')[[1]][3] != '3.5.0'){
  print("Warning: Update R")
}
  

Комментарии:

1. Вы можете либо изменить строку версии на число, либо сделать что-то вроде: if(strsplit(version[['version.string']], ' ')[[1]][3] < '3.5.0'){ print("Warning: Update R") }

2. На самом деле '3.4.0' < '3.5.0' , '3.4.9' < '3.5.0' возвращает TRUE , но я думаю, вам все еще нужны более строгие проверки.

3. Как насчет удаления точек as.numeric(gsub(".", "", substring(version[['version.string']], 11, 15), fixed = TRUE)) < 350

4. @Clemsang Что fixed=TRUE делает?

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

Ответ №1:

Вы можете преобразовать номер версии, подобный 3.5.0 в 350 , удалив точки. Таким образом, вы можете легко сравнить текущую и целевую версии :

 if(gsub(".", "", strsplit(version[['version.string']], ' ')[[1]][3], fixed = TRUE) < '350'){
  print("Warning: Update R")
}
  

Ответ №2:

В интерфейсе C есть хорошая функция convienence для этого. Вы можете увидеть, как это определено:

 #define R_VERSION 197890
#define R_NICK "Eggshell Igloo"
#define R_Version(v,p,s) (((v) * 65536)   ((p) * 256)   (s))
  

Итак, вы можете сделать что-то вроде этого:

 #include <Rversion.h>

// [[Rcpp::export]]
bool isVersionOutdated() {
#if R_VERSION < R_Version(3, 5, 1)
  return true;
#else
  return false;
#endif
}
  

Сторона R:

 library(Rcpp)
sourceCpp("test.cpp")
isVersionOutdated()
[1] FALSE