\ uxxxx последовательности внутри обратных кавычек - PullRequest
0 голосов
/ 30 апреля 2020

Я знаю, что, как правило, последовательности \uxxxx не поддерживаются внутри обратных ссылок. Есть ли у вас способ обойти их (\uxxxx последовательности) в именах столбцов?

Чтобы указать c, представьте себе расчет индекса массы тела и добавление единиц измерения к именам столбцов.

Начало с

dt<-data.frame(
  `Weight [kg]` = runif(5,50,100),
  `Height [m]` = runif(5,1.5,2),
  check.names=F
) 

и mutate:

> dt2<-dt %>% 
   mutate(
     `BMI [kg/m\u00b2]`= `Weight [kg]`/`Height [m]`^2
)

Это приводит к ошибке: Error: \uxxxx sequences not supported inside backticks (line 3).

Мой обходной путь такой:

> dt2<-dt %>% 
   mutate(
    `BMI [kg/m2]`= `Weight [kg]`/`Height [m]`^2
  ) %>% 
   set_colnames(colnames(.) %>% str_replace('2\\]', '\u00b2\\]'))

> colnames(dt2)
[1] "Weight [kg]" "Height [m]"  "BMI [kg/m²]"

Это дает мне именно то, что я хочу, но не очень элегантно.

Удивительно, но немного более ясный подход терпит неудачу:

> dt2<-dt %>% 
   mutate(
     `BMI [kg/m2]`= `Weight [kg]`/`Height [m]`^2
   ) %>% 
    rename_all(str_replace, '2\\]', '\u00b2\\]')

> colnames(dt2)
[1] "Weight [kg]" "Height [m]"  "BMI [kg/m2]"

Итак, мой вопрос: можно ли это сделать? не таким хакерским способом?

И:

  • да, я уверен, мне нужно \uxxx в именах столбцов;
  • да, я используйте их далее на графиках;
  • нет, я не хочу заменять их на expression.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Имена аргументов не обязательно должны быть в обратных галочках, они могут быть обычными строками в кавычках. Так что это прекрасно работает:

dt2<-dt %>% 
   mutate(
     "BMI [kg/m\u00b2]" = `Weight [kg]`/`Height [m]`^2
)

Будет трудно сослаться на имя этого столбца в выражениях в следующем коде; вам нужно будет указать столбец по номеру или использовать выражение, например dt2["BMI [kg/m\u00b2]"] (или dt2$"BMI [kg/m\u00b2]", используемое @AllanCameron в своем ответе). Но он будет печататься отлично:

> dt2
  Weight [kg] Height [m] BMI [kg/m²]
1    51.89918   1.825124    15.58029
2    80.74140   1.602126    31.45595
3    71.35380   1.974187    18.30799
4    64.44167   1.989202    16.28580
5    76.13564   1.886232    21.39922

Отредактировано, чтобы добавить: также прекрасно использовать

`BMI [kg/m²]` 

везде, где можно использовать имя столбца, вы просто не можете кодировать специальный символ с \uxxxx.

1 голос
/ 30 апреля 2020

Как насчет использования одинарных кавычек вместо обратных кавычек?

dt %>% mutate('BMI [kg/m\u00b2]' = `Weight [kg]`/`Height [m]`^2)
#>   Weight [kg] Height [m] BMI [kg/m²]
#> 1    67.68154   1.757490    21.91211
#> 2    72.32362   1.817616    21.89151
#> 3    89.28197   1.854459    25.96146
#> 4    52.14819   1.709520    17.84395
#> 5    83.48281   1.969367    21.52502

Или двойных кавычек?

dt %>% mutate("BMI [kg/m\u00b2]" = `Weight [kg]`/`Height [m]`^2)
#>   Weight [kg] Height [m] BMI [kg/m²]
#> 1    67.68154   1.757490    21.91211
#> 2    72.32362   1.817616    21.89151
#> 3    89.28197   1.854459    25.96146
#> 4    52.14819   1.709520    17.84395
#> 5    83.48281   1.969367    21.52502

Вы также можете использовать их для доступа к элементам в новом фрейме данных:

dt2$'BMI [kg/m\u00b2]'
#> [1] 21.91211 21.89151 25.96146 17.84395 21.52502

dt2$"BMI [kg/m\u00b2]"
#> [1] 21.91211 21.89151 25.96146 17.84395 21.52502

Или вам по какой-то причине нужно было использовать обратные кавычки?

...