R: могу ли я обновить класс объекта в трубе magrittr? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть кусок кода, где я обновляю класс объекта. Но я должен нарушить код, чтобы назначить класс. Можно ли изящно присвоить класс, но продолжить трубу, чтобы у меня была одна труба до конечного результата? Я подозреваю, что в {purrr} что-то может быть?

library(disk.frame)
library(dplyr)
library(tidyquery)

a = nycflights13::airports %>%
  as.disk.frame

class(a) <- c(class(a), "data.frame")

a %>% 
  query("SELECT name, lat, lon ORDER BY lat DESC LIMIT 5")

Ответы [ 2 ]

4 голосов
/ 24 октября 2019

Конечно, вы можете просто использовать "class<-"():

library(dplyr)

x <- 1:10 %>%
    "class<-"("foo")
x
#  [1]  1  2  3  4  5  6  7  8  9 10
# attr(,"class")
# [1] "foo"

Подробности

Как правило, в R, когда вы можете назначить выход функции, например, class(x) <- "foo", что выИспользуется «функция замены», например "class<-"(). Хорошее обсуждение этого вопроса по переполнению стека можно найти здесь .

2 голосов
/ 24 октября 2019

Использование setattr() из пакета data.table:

library(data.table)
x <- 1:10
x %>% setattr("class", c(class(x), "xiaodai's special"))
x

 [1]  1  2  3  4  5  6  7  8  9 10
attr(,"class")
[1] "integer"           "xiaodai's special"
...