не удается принудительно вызвать тип и переменную объекта не найдены в функции change_year - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь написать базовую c функцию с именем change_year, которая принимает два аргумента: значение типа Date и год (число). Если пользователь передает аргументы «2020-01-06» и «2025» в функции, он должен вернуть «2025-01-06» из функции.

Сейчас я пытаюсь преобразовать аргумент типа данных в строку, извлечь месяц и день из строки даты, объединить аргумент года со строкой месяца и дня и, наконец, преобразовать новый год снова в тип данных

Мой код в настоящее время:

#1.
spring_break <- as.Date("2020/03/21")

#2.
class(spring_break)

#3. 
today <- Sys.Date()

#4.
days_to_break <- spring_break - today
print(paste("Time difference of", days_to_break, "days"))

#5.
change_year <- function(date, year)
  date_as_string <- as.character(date)
  substr(date_as_string, 5, 10)
  paste(date_as_string, year)
  as.Date(date_as_string)

#6.
spring_break_2025 <- change_year(spring_break, 2025)
print(spring_break_2025)
class(spring_break_2025)

Однако, когда я пытаюсь выполнить функцию, возвращаются следующие ошибки

> #5.
> change_year <- function(date, year)
+   date_as_string <- as.character(date)
>   substr(date_as_string, 5, 10)
Error in as.character(x) : 
  cannot coerce type 'closure' to vector of type 'character'
>   paste(date_as_string, year)
Error in paste(date_as_string, year) : object 'year' not found
>   as.Date(date_as_string)
Error in as.Date.default(date_as_string) : 
  do not know how to convert 'date_as_string' to class “Date”

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Хотя вы можете использовать регулярные выражения или операции со строками для выполнения таких задач, но лучше использовать уже существующие функции для обработки значений даты и времени. Вы можете преобразовать объект строки / даты в POSIXlt объект и изменить его year компонент.

change_year <- function(date, year) {
   x <- as.POSIXlt(date)
   x$year <- year - 1900 #Since year is stored as number of years since 1990
   return(as.Date(x))
}

change_year('2018-06-21', 2025)
#[1] "2025-06-21"

change_year(as.Date('2018-06-21'), 2021)
#[1] "2021-06-21"
0 голосов
/ 21 января 2020

Кто-то уже сделал это. Пакет lubridate отлично подходит для работы и (в вашем случае) манипулирования датами.

library(lubridate)

spring_break <- as.Date("2020/03/21")

year(spring_break) <- 2025

spring_break

дает

[1] "2025-03-21"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...