@@ -3,6 +3,7 @@ library(traits)
33library(ggplot2 )
44library(lubridate )
55library(DataCache )
6+ library(timevis )
67
78# set options for BETYdb API
89knitr :: opts_chunk $ set(echo = FALSE , cache = TRUE )
@@ -17,18 +18,30 @@ rownames(seasons) <- paste0('[', seasons$start_date, ']', ' - ', '[', seasons$en
1718
1819# set page UI
1920ui <- fluidPage(
20- titlePanel(" BETYdb Trait Data" ),
21- sidebarLayout (
22- sidebarPanel(
23- # season menu
24- selectInput(' selectedSeason' , ' Season' , rownames(seasons )),
25- # variable menu to be rendered when variables for a given season are parsed in server()
26- uiOutput(' selectVariable' )
27- ),
28- mainPanel(
29- plotOutput(' traitPlot' )
30- )
21+
22+ title = " TERRA-REF Experimental Data" ,
23+
24+ h1(' TERRA-REF Experimental Data' ),
25+
26+ # season menu
27+ selectInput(' selectedSeason' , ' Season' , rownames(seasons )),
28+
29+ hr(),
30+
31+ h3(' Trait Data' ),
32+
33+ # variable menu to be rendered when variables for a given season are parsed in server()
34+ uiOutput(' selectVariable' ),
35+
36+ plotOutput(' traitPlot' ),
37+
38+ hr(),
39+ h3(' Managements Data' ),
40+
41+ fluidRow(
42+ timevisOutput(' timeline' )
3143 )
44+
3245)
3346
3447# load trait data from BETYdb
@@ -52,13 +65,28 @@ loadTraitData <- function(startDate, endDate) {
5265 # update progress bar
5366 incProgress(1 / initialDateDiff )
5467 }
68+ })
5569
56- # format data as for usability with DataCache library
57- retData <- list (fullTraitData )
58- names(retData ) <- ' fullTraitData'
70+ # format data as for usability with DataCache library
71+ retData <- list (fullTraitData )
72+ names(retData ) <- ' fullTraitData'
5973
60- return (retData )
61- })
74+ return (retData )
75+ }
76+
77+ getManagementsData <- function (startDate , endDate ) {
78+
79+ fullMgmtData <- data.frame ()
80+
81+ currDate <- startDate
82+ while (endDate - currDate != 0 ) {
83+ # get management data for each day
84+ currMgmtData <- betydb_query(table = ' managements' , date = paste0(' ~' , currDate ))
85+ fullMgmtData <- rbind(fullMgmtData , currMgmtData )
86+ currDate <- currDate + days(1 )
87+ }
88+
89+ return (fullMgmtData )
6290}
6391
6492# handle all app logic
@@ -80,6 +108,7 @@ server <- function(input, output) {
80108
81109 # get unique variable ids from observations in current season
82110 variableIds <- unique(as.numeric(fullTraitData $ variable_id ))
111+
83112 # query API for readable names for variable ids, set names
84113 variableNames <- vector()
85114 for (variableId in variableIds ) {
@@ -103,14 +132,30 @@ server <- function(input, output) {
103132 # get observations for selected variable
104133 variableIdData <- betydb_query(table = ' variables' , id = input $ selectedVariable )
105134 variableTraitData <- subset(fullTraitData , variable_id == as.numeric(variableIdData $ id ))
135+
136+ # get specie data for title
137+ specieId <- unique(as.numeric(variableTraitData $ specie_id ))
138+ specieData <- betydb_query(table = ' species' , id = specieId )
139+ title <- paste0(' Mean ' , gsub(' _' , ' ' , variableIdData $ name ), ' for ' , specieData $ scientificname )
106140
107141 # generate timeseries of boxplots from mean value
108142 ggplot(variableTraitData , aes(as.Date(date ), mean )) +
109143 geom_boxplot(aes(group = cut_width(as.Date(date ), 1 ))) +
110- xlab(" Dates" ) + ylab(variableIdData $ units ) +
144+ labs(title = title ,
145+ x = " Observation Dates" , y = variableIdData $ units ) +
111146 theme(text = element_text(size = 20 ), axis.text.x = element_text(angle = 45 , hjust = 1 ))
112147 }
113-
148+ })
149+
150+ # generate timeline visualization for managements data
151+ output $ timeline <- renderTimevis({
152+ mgmtData <- getManagementsData(startDate = seasonStartDate(), endDate = seasonEndDate())
153+ timelineData <- data.frame (
154+ id = 1 : nrow(mgmtData ),
155+ content = mgmtData $ mgmttype ,
156+ start = as.Date(mgmtData $ date )
157+ )
158+ timevis(timelineData )
114159 })
115160}
116161
0 commit comments