为什么 lubridate 在 shiny 中不起作用?
why won't lubridate work in shiny?
我从这样的数据开始:
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
假设时间已成功转换为 class 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" 填充两个小时列的每一行。我必须怎么做才能用实际时间填充我的小时列的行?
我无法重现您的 Shiny
代码,因为您缺少 ui
以及一些对象,例如 namedDF
.
但即使是您的楷书也不会产生您期望的结果。
我使用 dput
函数使数据可重现。 (参见 reproducible examples)
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
我从这样的数据开始:
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
假设时间已成功转换为 class 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" 填充两个小时列的每一行。我必须怎么做才能用实际时间填充我的小时列的行?
我无法重现您的 Shiny
代码,因为您缺少 ui
以及一些对象,例如 namedDF
.
但即使是您的楷书也不会产生您期望的结果。
我使用 dput
函数使数据可重现。 (参见 reproducible examples)
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