Р: могу ли я обновить класс объекта в канале магритта?

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

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")

person xiaodai    schedule 24.10.2019    source источник


Ответы (2)


Конечно, вы можете просто использовать "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<-"(). Хорошее обсуждение этого в Stack Overflow можно найти здесь.

person duckmayr    schedule 24.10.2019
comment
magrittr имеет псевдоним set_class - person Moody_Mudskipper; 27.10.2019
comment
@Moody_Mudskipper Хорошая мысль; Я не понимал этого, так как у меня есть версия CRAN magrittr. Позже я добавлю кое-что о возможности сделать это с версией для разработчиков. - person duckmayr; 27.10.2019
comment
о, тогда это больше моя ошибка, я думал, что это доступно в версии cran - person Moody_Mudskipper; 27.10.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"
person sindri_baldur    schedule 24.10.2019