【问题标题】:Passing argument to a function in shiny R将参数传递给闪亮的R中的函数
【发布时间】:2017-08-31 14:20:36
【问题描述】:

我正在尝试将简单网络的节点值作为参数传递给 Shiny R 中的函数。但是,我收到了这个错误:

rsqlite_send_query 中的错误:没有这样的列:input$id

谁能帮助解决这个问题?谢谢。

library(shiny)
library(networkD3)
ui <- shinyUI(fluidPage(
fluidRow(
    column(4, simpleNetworkOutput("simple")),
    column(4, DT::dataTableOutput("table"))
)
))

server <- shinyServer(function(input, output, session) { 
  session$onSessionEnded(stopApp)
  output$simple <- renderSimpleNetwork({
  sn<-simpleNetwork(df)
  sn$x$options$clickAction = 'Shiny.onInputChange("id",d.name)'
  sn
})

 output$table <- DT::renderDataTable(DT::datatable(get(funct(input$id))))

})

shinyApp(ui = ui, server = server) 

【问题讨论】:

标签: r shiny networkd3


【解决方案1】:
  1. 从您的sprintf 命令中取出deparsesubstitute,并在您要在生成的SQL 语句中匹配的值周围添加单引号

  2. 去掉get 函数,因为你不是要“获取”一个对象

例如....

library(shiny)
library(networkD3)
library(DT)
library(sqldf)

df <- read.csv(header = T, text = '
source,name,age,hair
dad,Jon X,18,brown
dad,Jon Y,22,blonde
')

funct <-
  function (n) {
    isp <- sprintf("Select df.age From df Where df.name='%s';", n)
    isd <- sqldf::sqldf(isp)
    return(isd)
  }

ui <- shinyUI(fluidPage(
  fluidRow(
    column(4, simpleNetworkOutput("simple")),
    column(4, DT::dataTableOutput("table"))
  )
))

server <- shinyServer(function(input, output, session) { 
  session$onSessionEnded(stopApp)
  output$simple <- renderSimpleNetwork({
    sn<-simpleNetwork(df)
    sn$x$options$clickAction = 'Shiny.onInputChange("id",d.name)'
    sn
  })

  output$table <- DT::renderDataTable(DT::datatable(funct(input$id)))
})

shinyApp(ui = ui, server = server)

但是,如果您只想显示与给定选择相关的值,我强烈建议您将复杂性大幅降低到这样的程度

library(shiny)
library(networkD3)

df <- read.csv(header = T, text = '
source,name,age,hair
dad,Jon X,18,brown
dad,Jon Y,22,blonde
')

ui <- shinyUI(fluidPage(
  fluidRow(
    column(4, simpleNetworkOutput("simple")),
    column(4, textOutput("text"))
  )
))

server <- shinyServer(function(input, output, session) { 
  session$onSessionEnded(stopApp)
  output$simple <- renderSimpleNetwork({
    sn <- simpleNetwork(df)
    sn$x$options$clickAction <- 'Shiny.onInputChange("id", d.name)'
    sn
  })

  output$text <- renderPrint({ df$age[df$name == input$id] })
})

shinyApp(ui = ui, server = server)

【讨论】:

  • 确实如此。如果我将节点链接到 URL,则 clickAction 有效。当我使用 output$table
  • 对不起,你是对的,有点...我们最近将simpleNetwork() 设为forceNetwork() 的别名,所以它从forceNetwork() 获得了这种能力...查看我的更新答案
  • 有效!我使用 get() 从 sqldf 获取数据框。现在我知道我哪里出错了。非常感谢!
  • 从 sprintf 命令中去掉 deparse 和替换后,代码可以工作,但它不适用于具有相似名称的 id。例如,我的 simpleNetwork 中有两个节点“Jon X”和“Jon Y”。这里的 input$id 似乎只考虑第一个单词。在这种情况下可以做些什么?谢谢。
  • 在这里尝试一些想法stackoverflow.com/questions/6502134/…
猜你喜欢
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2018-08-05
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多