r - 如何在 substr 中使用反应值?
问题描述
我的闪亮应用程序有问题。我希望用户可以输入 substr 函数所需的所有变量,以使用 dplyr 从数据框中过滤数据。
我使用数据框 iris 做了一个例子。
在 textInput(select1) 中,我喜欢输入“物种”。在 numericInput(start1) 中,我喜欢输入“4”。在 numericInput(end1) 我喜欢输入“6”。在 textInput(match1) 中,我喜欢输入“osa”。
现在我希望 tableOutput 仅显示与“物种”列中从数字 4 到 6 的条件“osa”匹配的行。
numericInput(start1)、numericInput(end1) 和 textInput(match1) 正在工作。但是 textInput(select1) 不起作用。当我使用输入作为变量时,我得到一个空数据框。
当我在 substr 函数中更改“物种”中的类型而不是 reactivevar1() 中的代码时,我得到了我想要的数据框。
例子:
filter(substr(Species, reactivevar2(), reactivevar3()) == reactivevar4())
这种替代方法有效。但这不是我想要的。
我希望这个工作:
filter(substr(reactivevar1(), reactivevar2(), reactivevar3()) == reactivevar4())
我尝试了不同的函数,例如 substring 和 stringr::str_sub。我也试过 as.character。
这是完整的例子:
library(shiny)
library(dplyr)
ui = fluidPage(
textInput(inputId="select1", label="Type in variable", value = "", width = NULL, placeholder = NULL),
numericInput(inputId="start1", label="Start digit", value=NULL, min = NA, max = NA, step = NA,
width = NULL),
numericInput(inputId="end1", label="End digit", value=NULL, min = NA, max = NA, step = NA,
width = NULL),
textInput(inputId="match1", label="Criteria to match", value = "", width = NULL, placeholder = NULL),
actionButton(inputId="startfil", label="Start filter", icon = NULL, width = NULL),
tableOutput('table')
)
server = function(input, output,session) {
obs <- observeEvent(input$startfil, {
var1 <- NA
reactivevar1 <- reactive({
var1 <- input$select1
return(var1)})
var2 <- NA
reactivevar2 <- reactive({
var2 <- input$start1
return(var2)})
var3 <- NA
reactivevar3 <- reactive({
var3 <- input$end1
return(var3)})
var4 <- NA
reactivevar4 <- reactive({
var4 <- input$match1
return(var4)})
irisfiltered <- iris %>%
filter(substr(reactivevar1(), reactivevar2(), reactivevar3()) == reactivevar4()) #reactivevar1() doesn't work
output$table <- renderTable(irisfiltered)
})
}
shinyApp(ui = ui, server = server)
我只是无法弄清楚我的代码有什么问题。重要的是用户可以输入开始和结束数字来过滤子字符串。
解决方案
欢迎来到 SO!
reactivevar1()
具有值“物种”,因此您的substr
函数返回“cie”。和
substr(reactivevar1(), reactivevar2(), reactivevar3()) == reactivevar4()
返回FALSE
, 当你输入 ie "osa" inreactivevar4()
您可以get
像这样在管道语句中使用:
irisfiltered <- iris %>%
filter(substr(get(reactivevar1()), reactivevar2(), reactivevar3()) == reactivevar4())
output$table <- renderTable(irisfiltered)
或者利用!!
andas.name
iris %>%
filter(substr(!!as.name(reactivevar1()), reactivevar2(), reactivevar3()) == reactivevar4())
output$table <- renderTable(irisfiltered)
希望这可以帮助
推荐阅读
- python - 是否有将 Postgre 的 SQL 代码转换为 MySQL 的命令行工具?
- go - 未定义:Windows 10 上的 syscall.Mmap
- c# - 如何在asp.net mvc中使用jquery ajax在方法中调用字符串
- ios - Xcode 10 中的地图功能更改
- r - doMPI 和用户定义的包
- javascript - 基于另一个包含对象的数组的字符串数组 [JS/TypeScript]
- python - 如何使用 pixmap 将图像添加到 QGraphicsScene 类中
- ios - 针对 iOS 缩放模式的 React Native 修复
- php - 在php中创建类的动态方法
- php - php - 如何在同一页面上显示数据?