首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R Shiny:获取动态用户输入,并将其作为函数的向量

R Shiny:获取动态用户输入,并将其作为函数的向量
EN

Stack Overflow用户
提问于 2021-10-14 22:29:42
回答 1查看 79关注 0票数 0

我对r非常陌生,所以这可能是一个简单的修复方法。我的问题是,我试图从用户那里获得14个不同的整数输入,从这些输入创建一个向量,并将该向量传递给一个函数。我希望我能动态地做到这一点。

下面是我的代码:

代码语言:javascript
复制
# Function
sonnet_print_vector <- function(user_vector){
    sonnet_list <- NULL
    for (i in seq_along(user_vector)){
        next_line <- filter(sonnets, sonnet==user_vector[i], line==i) %>%
            select(text)
        sonnet_list <- bind_rows(sonnet_list, next_line)
    }
    print(sonnet_list)
}

# Shiny script
ui <- fluidPage(
    numericInput("row1", "Which sonnet would you like displayed for row 1?", 1),
    numericInput("row2", "Which sonnet would you like displayed for row 2?", 1), 
    numericInput("row3", "Which sonnet would you like displayed for row 3?", 1), 
    numericInput("row4", "Which sonnet would you like displayed for row 4?", 1), 
    numericInput("row6", "Which sonnet would you like displayed for row 6?", 1), 
    numericInput("row5", "Which sonnet would you like displayed for row 5?", 1), 
    numericInput("row7", "Which sonnet would you like displayed for row 7?", 1), 
    numericInput("row8", "Which sonnet would you like displayed for row 8?", 1), 
    numericInput("row9", "Which sonnet would you like displayed for row 9?", 1), 
    numericInput("row10", "Which sonnet would you like displayed for row 10?", 1), 
    numericInput("row11", "Which sonnet would you like displayed for row 11?", 1), 
    numericInput("row12", "Which sonnet would you like displayed for row 12?", 1), 
    numericInput("row13", "Which sonnet would you like displayed for row 13?", 1), 
    numericInput("row14", "Which sonnet would you like displayed for row 14?", 1), 
    custom_sonnet <- c(row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, row13, row14),
    verbatimTextOutput("q")
)

server <- function(input, output){
    output$q <- renderText({
        paste("Printing custom sonnet", input$custom_sonnet, "here:\n\n")
        paste(sonnet_print_vector(input$custom_sonnet), "\n")
    })
}

shinyApp(ui = ui, server = server)

它相当笨重,所以我对此感到抱歉。我已经用了一个小时了,所以我可能漏掉了一些简单的东西。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-10-15 03:50:08

尝尝这个。我不知道你的数据帧中有什么,也不知道函数之后的df是什么样子的,所以我创建了一个10行的假df。我想象每一行都是一些十四行诗的文本,所以我使用“十四行诗1-10”。

我写的函数也很简单,只需返回user_vector即可。您可以在# do something下面添加您自己的内容,并更改返回。

然后,我们可以创建您的14个输入,并通过以下方式获得值:

代码语言:javascript
复制
library(shiny)
sonnet <- data.frame(rows = paste0("sonnet", 1:10))

# function
myfunc <- function(user_vector){
    user_vector <- as.numeric(unlist(reactiveValuesToList(user_vector)))
    # do something
    
    user_vector
}


ui <- fluidPage(
    column(6,
       lapply(1:14, function(i){
           numericInput(
               paste0("row", i), 
               paste0("Which sonnet would you like displayed for row ", i, "?"), 
               value = 1, min = 1, max = nrow(sonnet)
           )
       })    
    ),    
    column(6,
        verbatimTextOutput("q")    
    )
)

server <- function(input, output, session) {
    user_vector <- reactiveValues()
    lapply(paste0("row", 1:14), function(x) {
      observeEvent(input[[x]], {
          user_vector[[x]] <- input[[x]]
      })  
    })
    output$q <- renderPrint({
        cat("Printing custom sonnet\n")
        cat(sonnet$rows[myfunc(user_vector)], sep = "\n")
        cat("user vector is: ", myfunc(user_vector), "\n")
    })
}

shinyApp(ui, server)

尝试更改用户输入,并观察您的十四行诗行是如何变化的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69578064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档