Как интерпретировать. как переменная, а не как заполнитель, использующий оператор прямой трубы magrittr

Я хотел бы создать цепочку каналов magrittr для вызова вложенной функции ниже, которая дает точно такой же результат.

Следующее возвращает фрейм данных со столбцами my_names и Freq.

my_names <- c('John', 'Joe', 'Jane', 'John', 'John', 'Jane')

test_df <- as.data.frame.table(sort(table(my_names), decreasing = TRUE))

   my_names Freq
1     John    3
2     Jane    2
3      Joe    1

Используя magrittr, приведенная ниже цепочка конвейеров возвращает фрейм данных со столбцами . и Freq.

library(magrittr)

test_df <- my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table 

   . Freq
1 John    3
2 Jane    2
3  Joe    1

Добавление %>% dplyr::rename(my_names = .) не сработает, поскольку . интерпретируется как заполнитель, а не как имя столбца.

Чтобы получить тот же результат, что и при вызове вложенной функции, мне нужно использовать дополнительный вызов функции: test_df <- dplyr::rename(test_df, my_names = .)

Есть ли способ указать %>% интерпретировать . как имя переменной, а не как заполнитель в последующем вызове?


person alex23lemm    schedule 26.12.2014    source источник
comment
Я получаю те же имена столбцов, используя конвейеры, что и при вложении (используя разрабатываемую версию dplyr).   -  person aosmith    schedule 29.12.2014
comment
@aosmith Спасибо! При использовании последних разрабатываемых версий dplyr (0.3.0.9) и lazyeval (0.1.9.9001) цепочка конвейеров дает тот же результат, что и вызов вложенной функции.   -  person alex23lemm    schedule 31.12.2014


Ответы (2)


Это очень, очень поздно, но вы можете использовать версию rename_ (с символом подчеркивания) и строку ".". Это позволяет избежать нестандартной оценки и, следовательно, работает вокруг %>%, заменяя ..

test_df <- my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table %>%
    rename_(my_names=".")

#  my_names Freq
#1     John    3
#2     Jane    2
#3      Joe    1
person Hong Ooi    schedule 20.07.2015

Решение, предложенное @aosmith@ в комментариях, проработало всего пару дней.

Последняя версия 0.4 для разработчиков dplyr также создает фрейм данных со столбцом .:

devtools::install_github("hadley/lazyeval")
devtools::install_github("hadley/dplyr")
library(dplyr)

my_names <- c('John', 'Joe', 'Jane', 'John', 'John', 'Jane')

my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table

. Freq
1 John    3
2 Jane    2
3  Joe    1

Мое текущее решение теперь выглядит следующим образом и было предложено docendo discimus ранее:

my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table %>%
  setNames(c('my_names', 'Freq'))
person alex23lemm    schedule 06.01.2015