Writing to the log within a loop, results in the last value to be written 'N' times. I'm guessing this is because of the future evaluation, but I'm not sure how to get around it.
test_data <- data.frame(id = 1:5, data = LETTERS[1:5], stringsAsFactors = FALSE)
for (i in seq_len(nrow(test_data))) {
message('Writing to log: ', jsonlite::toJSON(test_data[i, ]))
server$log('test', jsonlite::toJSON(list(input = test_data[i, ])))
}
outputs:
Fire started at 127.0.0.1:8080
2019-02-26 13:53:01 - start: 127.0.0.1:8080
2019-02-26 13:53:01 - message: Writing to log: [{"id":1,"data":"A"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":2,"data":"B"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":3,"data":"C"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":4,"data":"D"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":5,"data":"E"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: 1
2019-02-26 13:53:01 - request: 127.0.0.1 - ID_127.0.0.1 [26/Feb/2019:13:53:01 +0100] "GET / HTTP/1.1" 200 48
2019-02-26 13:53:06 - message: Goodbye
2019-02-26 13:53:06 - stop: 127.0.0.1:8080
complete example based on the minimal fiery example:
library(fiery)
# Create a New App
app <- Fire$new()
app$set_logger(logger_console())
# Setup the data every time it starts
app$on('start', function(server, ...) {
server$set_data('visits', 0)
server$set_data('cycles', 0)
})
# Count the number of cycles (internal loops)
app$on('cycle-start', function(server, ...) {
server$set_data('cycles', server$get_data('cycles') + 1)
})
# Count the number of requests
app$on('before-request', function(server, ...) {
server$set_data('visits', server$get_data('visits') + 1)
})
# Handle requests
app$on('request', function(server, request, ...) {
response <- request$respond()
response$status <- 200L
response$body <- paste0('<h1>This is indeed a test. You are number ', server$get_data('visits'), '</h1>')
response$type <- 'html'
test_data <- data.frame(id = 1:5, data = LETTERS[1:5], stringsAsFactors = FALSE)
for (i in seq_len(nrow(test_data))) {
message('Writing to log: ', jsonlite::toJSON(test_data[i, ]))
server$log('test', jsonlite::toJSON(list(input = test_data[i, ])))
}
TRUE
})
# Show number of requests in the console
app$on('after-request', function(server, ...) {
message(server$get_data('visits'))
flush.console()
})
# Terminate the server after 50 cycles
app$on('cycle-end', function(server, ...) {
if (server$get_data('cycles') > 50) {
message('Ending...')
flush.console()
server$extinguish()
}
})
# Be polite
app$on('end', function(server) {
message('Goodbye')
flush.console()
})
app$ignite(showcase = TRUE)
Writing to the log within a loop, results in the last value to be written 'N' times. I'm guessing this is because of the future evaluation, but I'm not sure how to get around it.
outputs:
complete example based on the minimal fiery example: