2
votes

Erreur lors de l'utilisation du caractère spécial avec reprex :: reprex ()

J'ai découvert que reprex::reprex ne peut pas lire le caractère ¦ (et un autre caractère spécial comme «Ã ©») et lance une erreur. Existe-t-il un moyen de faire fonctionner reprex avec le codage local (ici en français)?

Reprex

devtools::install_github("tidyverse/reprex")

Sortie dans le volet de la visionneuse

 Error : callr subprocess failed: <text>:28:1: ')' unexpected
27:         locale = c("LC_COLLATE" = "fr_LU.UTF-8")
28: )
    ^

Informations sur la session

reprex_locale(x = {
    tibble::tribble(
        ~var1,          ~var2, ~var3,
        "gr¦pefruit",   "ugli fruit",    4L,
        "huckleberry",      "kumquat",    6L,
        "duri¦n", "blackcurrant",    1L,
        "d¦te",   "cantaloup¦",    1L,
        "fig", "canary m¦lon",    6L,
        "s¦l¦l berry",     "rambutan",    5L
    )}, language = "fr",
    locale = c("LC_COLLATE" = "fr_LU.UTF-8")
)

Mise à jour avec la suggestion de polkas

La locale = c("LC_COLLATE" = "French_France.1252") et la locale = c("LC_COLLATE" = "fr_LU.UTF-8") ont été essayées avec le résultat d'erreur suivant:

code

R version 4.0.2 (2020-06-22)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252   
[3] LC_MONETARY=French_France.1252 LC_NUMERIC=C                  
[5] LC_TIME=French_France.1252    

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

loaded via a namespace (and not attached):
 [1] pillar_1.4.6      compiler_4.0.2    prettyunits_1.1.1
 [4] remotes_2.1.1     tools_4.0.2       testthat_2.3.2   
 [7] digest_0.6.25     pkgbuild_1.1.0    pkgload_1.1.0    
[10] evaluate_0.14     memoise_1.1.0     lifecycle_0.2.0  
[13] tibble_3.0.3      pkgconfig_2.0.3   rlang_0.4.7      
[16] reprex_0.3.0      cli_2.0.2         rstudioapi_0.11  
[19] yaml_2.2.1        blogdown_0.20.2   xfun_0.15        
[22] stringr_1.4.0     withr_2.2.0       knitr_1.29       
[25] desc_1.2.0        fs_1.4.2          vctrs_0.3.2      
[28] devtools_2.3.0    rprojroot_1.3-2   glue_1.4.1       
[31] R6_2.4.1          processx_3.4.3    fansi_0.4.1      
[34] rmarkdown_2.3     bookdown_0.20     sessioninfo_1.1.1
[37] whisker_0.4       callr_3.4.3       clipr_0.7.0      
[40] magrittr_1.5      backports_1.1.7   ps_1.3.3         
[43] ellipsis_0.3.1    htmltools_0.5.0   usethis_1.6.1    
[46] assertthat_0.2.1  utf8_1.1.4        stringi_1.4.6    
[49] crayon_1.3.4 

console

``` r
tibble::tribble(
    ~var1,          ~var2, ~var3,
    "gr


---
title: reprex_reprex.R
author: cbo
date: '2020-11-08'

---
#> Error: <text>:3:9: INCOMPLETE_STRING inattendu(e)
#> 10: 
#> 11: ---
#>             ^

Solution utilisée - pour ceux qui pourraient suivre

TL; DR : l'erreur est limitée au OS Windows d' OS Windows avec reprex 0.3.0 , l'installation de la version de développement a donc résolu le problème:

reprex::reprex(x = {
    tibble::tribble(
        ~var1,          ~var2, ~var3,
        "gr¦pefruit",   "ugli fruit",    4L,
        "huckleberry",      "kumquat",    6L,
        "duri¦n", "blackcurrant",    1L,
        "d¦te",   "cantaloup¦",    1L,
        "fig", "canary m¦lon",    6L,
        "s¦l¦l berry",     "rambutan",    5L
    )
})

Le pourquoi c'est arrivé : comme mentionné par @cderv et bien expliqué dans le billet de blog ci-joint, R dans Windows a tendance à utiliser le codage local comme étape intermédiaire lors de l'écriture d'un fichier. Ainsi, lorsque vous utilisez writeLines() avec R-Windows, cela writeLines() les caractères spéciaux à moins que vous ne writeLines(..., usebytes = "TRUE") aucune étape intermédiaire et l'utilisation d'octets tout au long de writeLines(..., usebytes = "TRUE") .

r

0 commentaires

3 Réponses :


1
votes

Il est difficile de reproduire votre environnement même avec le package withr . Dans mon environnement, cela fonctionne toujours correctement.

Cette solution de tidyverse pourrait fonctionner https://github.com/tidyverse/reprex/blob/master/R/reprex-locale.R :

reprex_locale <- function(...,
                          language = "en",
                          locale = NULL) {
  withr::local_envvar(c(LANGUAGE = language))
  if (!is.null(locale)) {
    # If we use withr::local_locale(), the new locale is NOT inherited by the
    # reprexing child process. Whereas it is if we use an env var approach.
    withr::local_envvar(locale)
  }
  reprex(...)
}

Je comprends que reprex_locale avec language = "fr" et certains locale pourraient fonctionner pour vous.


5 commentaires

Merci pour votre réponse polkas. J'ai essayé votre suggestion avec language = "fr" et locale = c(LC_COLLATE = French_France.1252) et avec seulement la version par défaut sans succès: Error: callr subprocess failed: <text>:27:1: unexpected ')' . Ce n'est pas encore exporté dans le package, il pourrait donc être encore en développement.


Je pense que c'est un problème uniquement Windows; Je le vois lorsque j'exécute votre code là-bas, mais pas sur macOS.


J'ai essayé de le déboguer, mais il n'arrête pas de planter R. Il y a un bogue d'encodage quelque part, mais je ne le trouve pas.


essayez de changer votre locale en fr_LU.UTF-8. Je vais commencer à partir de la ligne de commande et essayer d'utiliser echo sth_french si cela fonctionne - s'il s'agit d'un problème R.


Bien essayé mais le résultat reste le même.



0
votes

J'ai trouvé ce travail pour Windows et la version actuelle de reprex CRAN (0.3.0) avec le code de caractère ANSI \xa6 pour ¦ :

reprex::reprex(x = {
    dfr <- tibble::tribble(
        ~var1,          ~var2, ~var3,
        "gr\xa6pefruit",   "ugli fruit",    4L,
        "huckleberry",      "kumquat",    6L,
        "duri\xa6n", "blackcurrant",    1L,
        "d\xa6te",   "cantaloup\xa6",    1L,
        "fig", "canary m\xa6lon",    6L,
        "s\xa6l\xa6l berry",     "rambutan",    5L
    )


0 commentaires

2
votes

Je pense que cela est dû au fonctionnement de Windows et de l'encodage. Par défaut, Windows n'est pas UTF8 et vous avez un caractère spécial qui, je crois, nécessite cet encodage.

Parfois, le comportement est délicat car R utilisera le codage par défaut qui est native et cela peut donner un résultat inattendu car il sera converti en natif avant d'écrire dans le fichier. Voir cet excellent article à ce sujet: https://kevinushey.github.io/blog/2018/02/21/string-encoding-and-r/

Pour que ça marche, je voudrais

  • écrire le code à reprex dans un fichier R, encodé en UTF8
reprex::reprex(input = "test.R")
  • Ensuite, utilisez reprex sur ce fichier
tibble::tribble(
  ~var1,          ~var2, ~var3,
  "gr¦pefruit",   "ugli fruit",    4L,
  "huckleberry",      "kumquat",    6L,
  "duri¦n", "blackcurrant",    1L,
  "d¦te",   "cantaloup¦",    1L,
  "fig", "canary m¦lon",    6L,
  "s¦l¦l berry",     "rambutan",    5L
)

Cela fonctionne pour moi.

Il peut y avoir un problème dans reprex sur la façon dont il écrit dans un fichier sous Windows lorsque vous fournissez du code directement dans reprex::reprex()


0 commentaires