R c () "функция комбинирования", установить класс не по первому вводу - PullRequest
1 голос
/ 17 июня 2020

Я обнаружил, что пишу какой-то уродливый код для установки класса объединенных объектов. Есть ли более простой / быстрый способ сделать это? Ниже пример моей проблемы:

#some S3 class vector
y = structure(c(1577833200, 1577836800, 1577840400, 1577844000, 1577847600
), class = c("POSIXct", "POSIXt"), tzone = "")

#correct class
class(y)

#I want to front pad the vector with missing values, maybe sometimes append something else

#[1], correct class but only because y is first
x_right_class = c(y,NA)
class(x_right_class)

#[2] drops "POSIXct", "POSIXt" class because NA does not have that class
x_wrong_class = c(NA,y)
class(x_wrong_class)

#[3] this one works but is tedious, and looks ugly, maybe also slow
x_also_right_class = c(y[NA_integer_],y)


#is there a simpler/faster way, I can have the c()-function to behave like [1] (and not 2) without doing [3]
#simpler for better looking code, faster to avoid unnecessary reallocation of large vectors. I guess one time is inevitable.

update: по ответам / комментариям кажется возможным настроить c () в новую функцию r c () «обратное объединение», которая рассылки по n-му объекту. Полагаю, для этой функции могут потребоваться дополнительные проверки безопасности, но, похоже, это неплохо.

rc = function(...,dispath_by=NULL) {
  l = list(...)
  if(is.null(dispath_by)) dispath_by= length(l)
  class(l[[1]]) = class(l[[dispath_by]])
  do.call(c,l)
}

x_also_right_class = rc(NA, y)

x_also_right_class = rc(NA, y,NA,dispath_by=2)

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Вызов метода явно работает:

c.POSIXct(NA, y)

Однако я не понимаю, почему этот метод не вызывается при использовании c ().

1 голос
/ 17 июня 2020

преобразовать NA в POSIXct

x_wrong_class = c(as.POSIXct(NA),y)
class(x_wrong_class)
#[1] "POSIXct" "POSIXt"

Если класс if y неизвестен, мы можем сделать что-то вроде этого:

add_value <- NA
class(add_value) <- class(y)
c(add_value, y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...