Sys.setlocale: requête pour définir locale ... ne peut pas être honorée

j'utilise strptime(...) dans une fonction de mon colis. J'ai besoin d'analyser une chaîne de caractères en utilisant des paramètres locaux et utilisé Sys.setlocale comme solution de contournement pour obtenir les paramètres de localisation en anglais. Pour réduire les effets secondaires, le cadre local précédent est restauré par la suite. La base fragment de code de la fonction se présente comme suit:

#parameter settings
sometext <- "Mon, 14 Mar 2011 23:42:16 GMT"
timeFormat <- "%a, %d %b %Y %H:%M:%S"
timeZone <- "GMT"
#get current locale
loc <- Sys.getlocale("LC_TIME")
#set british localization
dummy <- Sys.setlocale("LC_TIME", "en_GB.UTF-8")
#parse datetime string
time <- strptime(sometext, format = timeFormat, tz= timeZone)
#set local back
dummy <- Sys.setlocale("LC_TIME", loc)

malheureusement, un de mes collègues reçoit l'avertissement suivant en utilisant cette fonction:

In Sys.setlocale("LC_TIME", "en_GB.UTF-8") :
OS reports request to set locale to "en_GB.UTF-8" cannot be honored

Sur mon ordinateur, tout fonctionne bien. Y a-t-il une meilleure façon (et indépendante de la localisation installée) d'effectuer cette tâche? En général, je voudrais utiliser strptime car il permet une façon très flexible d'analyser les chaînes datetime.

8
demandé sur user625626 2011-03-17 23:54:54

2 réponses

je suis tout à fait sûr que le "en_GB.UTF-8 " locale n'est pas installé sur l'ordinateur de votre collège. La façon la plus simple pourrait être de l'installer :) Eh bien, ce n'est pas trivial avec chaque OS.

une autre option pourrait être d'utiliser une locale standard qui peut être trouvée sur chaque ordinateur. Comme votre exemple Ajouté ne montre aucun format spécial, vous pouvez essayer de définir LC_TIMEC, qui fonctionne aussi sous Linux et Windows. Avec ce lieu, votre exemple donné fonctionnera comme un charme. Voir:

> Sys.setlocale("LC_TIME", "C")
> strptime("Mon, 14 Mar 2011 23:42:16 GMT", format = "%a, %d %b %Y %H:%M:%S", tz="GMT")
[1] "2011-03-14 23:42:16 GMT"

ou autrement vous devriez transformer vos données - par exemple: écrire une fonction courte pour remplacer toutes les semaines et les mois de nom aux chaînes standard et restructurer vos chaînes importées aux chaînes standard.

9
répondu daroczig 2011-03-17 23:10:08

j'ai essayé votre code sur ma machine Windows et obtenir la même erreur. Pour référence, les résultats de LA SAJR.getlocale ("LC_TIME"):

> Sys.getlocale("LC_TIME")
[1] "English_United Kingdom.1252"

je pense que cela pourrait être un endroit assez standard.

Mais je pense aussi que la meilleure façon d'aborder ce problème est d'utiliser certaines fonctions du package lubridate, ce qui le rend facile de travailler avec des dates.

Vous ne donnez pas assez de détails dans votre question ce que vous essayez de faire, mais je devine ce "sometext" est dans un format prévu spécifique, tel que DMY ou YMD. Lubridate fournit des fonctions pour analyser les dates dans n'importe quel format spécifié, par exemple dmy(), ymd(), mdy() - vous obtenez l'image.

Si vous fournir plus de détails sur votre problème, nous pourrions être en mesure d'aider plus précisément.

1
répondu Andrie 2011-03-17 22:09:33