почему смазка не работает в блестящих?

Я начинаю с данных, которые выглядят так:

Date       Time1            Time2
01/02/2018 01/02/2018 11:12 01/02/2018 13:14
01/03/2018 01/03/2018 09:09 01/03/2018 15:05

и я хочу, чтобы результат выглядел так:

Date       Time1            Time2            Hour1    Hour2
01/02/2018 01/02/2018 11:12 01/02/2018 13:14 11       13
01/03/2018 01/03/2018 09:09 01/03/2018 15:05  9       15

Предположим, что время было успешно переведено в класс POSIXct.

В обычном сценарии R я использую этот код для создания своего вывода:

library(lubridate)
a <- ymd_hms(myDF$Time1)
var4 = hour(a)
myDF = cbind(myDF, var4, stringsAsFactors=FALSE)
names(myDF)[4]<-"Hour1"

library(lubridate)
a <- ymd_hms(myDF$Time2)
var5 = hour(a)
myDF = cbind(myDF, var5, stringsAsFactors=FALSE)
names(myDF)[5]<-"Hour2"

Но то, что работает в обычном R-скрипте, кажется, терпит неудачу, когда я пытаюсь запустить точно такой же код в блестящем приложении.

Когда я пытаюсь запустить этот код:

shinyServer(function(input, output))({
 output$contents <- renderTable({
  inFile <- input$file1
  if (is.null(inFile))
   return(NULL)
  myDF = read.csv(inFile$datapath, sep=",")

  timesData = myDF[,c(2:3)]
  timesData$Time1 = as.POSIXct(timesData$Time1, format="%m/%d/%Y %H:%M", 
   tz="GMT")
  timesData$Time2 = as.POSIXct(timesData$Time2, format="%m/%d/%Y %H:%M", 
   tz="GMT")

  library(lubridate)
  a <- ymd_hms(timesData$Time1)
  var4 = hour(a)
  myDF = cbind(myDF, var4, stringsAsFactors=FALSE)
  names(myDF)[4]<-"Hour1"

  library(lubridate)
  a <- ymd_hms(timesData$Time2)
  var5 = hour(a)
  myDF = cbind(myDF, var5, stringsAsFactors=FALSE)
  names(myDF)[5]<-"Hour2"
 })
})

shinyui(
 mainPanel(
  tableOutupt("contents")
 )
))

Я получаю это как мой вывод:

Date       Time1            Time2            Hour1    Hour2
01/02/2018 01/02/2018 11:12 01/02/2018 13:14 18       18
01/03/2018 01/03/2018 09:09 01/03/2018 15:05 18       18

Он заполняет каждую строку обоих часовых столбцов значением «18», а когда я попытался использовать «a ‹- ymd_hm(timesData$Time2)», он вместо этого заполнил каждую строку обоих часовых столбцов значением «NA». Что мне нужно сделать, чтобы он заполнил строки моих часовых столбцов фактическими часами?


person Jennifer B.    schedule 13.01.2018    source источник
comment
Я отредактировал вопрос, включив в него код пользовательского интерфейса.   -  person Jennifer B.    schedule 16.01.2018


Ответы (1)


Я не могу воспроизвести ваш код Shiny, так как вам не хватает ui, а также некоторых объектов, таких как namedDF.

Но даже ваш обычный скрипт не дает ожидаемого результата.

Я сделал данные воспроизводимыми с помощью функции dput. (См. воспроизводимые примеры)

library(tidyverse)
myDF <- structure(list(Date = c("01/02/2018", "01/03/2018"), Time1 = c("01/02/2018 11:12", 
                                                                       "01/03/2018 09:09"), Time2 = c("01/02/2018 13:14", "01/03/2018 15:05"
                                                                       )), .Names = c("Date", "Time1", "Time2"), class = c("tbl_df", 
                                                                                                                           "tbl", "data.frame"), row.names = 1:2)

Это те же данные, которые вы вставили.

myDF
# # A tibble: 2 x 3
# Date       Time1            Time2           
# <chr>      <chr>            <chr>           
# 1 01/02/2018 01/02/2018 11:12 01/02/2018 13:14
# 2 01/03/2018 01/03/2018 09:09 01/03/2018 15:05

Теперь, если вы используете ymd_hms, вы увидите, что он не может правильно проанализировать дату и время. (Часы анализируются как 18, что соответствует вашему примеру)

ymd_hms(myDF$Time1)
# [1] "2001-02-20 18:11:12 UTC" "2001-03-20 18:09:09 UTC"

Вместо этого вы можете выполнить синтаксический анализ с помощью функции parse_datetime, указав формат (подробности см. в разделе ?parse_datetime).

А затем используйте функцию hour для подмножества часов из даты и времени.

myDF <- myDF %>% mutate(
  Time1 = parse_datetime(Time1, format = "%m/%d/%Y %H:%M"),
  Time2 = parse_datetime(Time2, format = "%m/%d/%Y %H:%M"),
  Hour1 = hour(Time1),
  Hour2 = hour(Time2)
)

Результат:

myDF
# A tibble: 2 x 5
Date       Time1               Time2               Hour1 Hour2
<chr>      <dttm>              <dttm>              <int> <int>
1 01/02/2018 2018-01-02 11:12:00 2018-01-02 13:14:00    11    13
2 01/03/2018 2018-01-03 09:09:00 2018-01-03 15:05:00     9    15
person GyD    schedule 13.01.2018
comment
Я попробовал решение GyD и получил сообщение об ошибке: Ошибка оценки: не удалось найти функцию parse_datetime. Вместо этого я попытался использовать parse_date_time(), например так: Time1 = parse_date_time(timesData$Tender, orders = %m/%d/%Y %H:%M), а затем Hour1 = hour(Time1), но все, что я получаю, это предупреждение : Не удалось разобрать все форматы. Форматы не найдены. - person Jennifer B.; 16.01.2018
comment
@JenniferB Вы установили и загрузили tidyverse? Функция parse_datetime находится в пакете readr, который является частью tidyverse. - person GyD; 16.01.2018
comment
Спасибо Гид. У меня не были установлены пакеты tidyverse. После того, как я установил их и снова попробовал ваше решение, оно сработало! - person Jennifer B.; 17.01.2018