#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