首页 > 解决方案 > Shiny 的 RadioButton 选择值未正确存储在 MySQL 数据库中

问题描述

我正在 Shiny 中开发一个问卷,它使用 RadioButtons 收集一些用户数据,并根据用户选择的值生成可视化。

我正在尝试将我的单选按钮的选择值存储在 Amazon AWS 上托管的 MySQL 数据库中。我已按照 Dean Attali 的文章使其工作。

一切正常,除了我的单选按钮中的选择值没有正确插入数据库中。我正在尝试将所有这些值作为“TEXT”类型存储在 MySQL 数据库中。

以下是我正在使用的代码。

假设我有一个ui.R我定义 3 的地方,radioButtons称为dt_ds_q1,dt_ds_q2dt_ds_q3。根据用户的选择,这些radioButtons提供0或的值1

以下是server.R我在数据库中用于 INSERTING 的片段:

# Define the fields that need to be saved.
fields <- c("dt_ds_q1", "dt_ds_q2", "dt_ds_q3")

# Function for Saving Data on MySQL.
saveDataMySQL <- function(data, unique_id, session_id) {
    # Connect to the database
    db <- dbConnect(MySQL(), 
                    dbname = databaseName, 
                    host = options()$mysql$host, 
                    port = options()$mysql$port, 
                    user = options()$mysql$user, 
                    password = options()$mysql$password)
    
    # Concatenating UniqueID, SessionID, and Timestamp
    data <- as.data.frame(t(data))
    dt <- data %>% add_column(unique_id = unique_id, 
                             session_id = session_id,
                             timestamp = Sys.time())
    
    # Construct the update query by looping over the data fields
    query <- sprintf(
        "INSERT INTO %s (%s) VALUES ('%s')",
        table, 
        paste(names(dt), collapse = ", "),
        paste(dt, collapse = "', '")
    )
    
    # Submit the update query and disconnect
    dbGetQuery(db, query)
    dbDisconnect(db)
}

shinyServer(function(input, output) {

# Get form data from questionnaire
    formData <- reactive({
        data <- sapply(fields, function(x) input[[x]])
        data
    })

# Save data when someone clicks on the navbar title.
observeEvent({
        input$ati == "NAVBARNAME"
    },
                 saveDataMySQL(formData(), unique.id(), session.id()))
})

我得到的输出如下图所示。

输出截图

但是,所需输入的值应为 1 或 0。

预先感谢您的任何帮助。

标签: mysqlrshiny

解决方案


我解决了这个问题。我不必要地将列表转换formData()data.frame函数定义中的saveDataMySQL()。以下是更新的代码片段,它解决了我的问题(在saveDataMySQL()方法的定义中:

# Adding unique ID, session ID and timestamp to list
    data <- c(data, unique_id, session_id, Sys.time())
    
    # Construct the update query by looping over the data fields
    query <- sprintf(
        "INSERT INTO %s (%s) VALUES ('%s')",
        table, 
        paste(fields_all, collapse = ", "),
        paste(dt, collapse = "', '")
    )

其中,fields_all是列名列表,我将其明确定义为:

fields_all = c("dt_ds_q1", "dt_ds_q2", "dt_ds_q3", "unique_id", "session_id", "timestamp")

推荐阅读