2017-08-08 65 views
1

我试图作为参数传递一个简单的网络的节点值,以闪亮R.一个函数但是,我发现了这样的错误:传递函数参数在光泽ř

在rsqlite_send_query错误:没有这样的列:输入$ 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) 
+0

什么是'df','funct' ?请添加'library(DT)' – HubertL

+0

@HubertL库(DT)已包含在内。 df是数据帧。函数是我想要传递节点值的函数。功能(n){ isp <-sprintf(“Select df.'age' From df Where df.name =%s;”,deparse(substitute(n))) isd < - sqldf(isp ) return(isd) } – Poppin

+0

[将networkd3中的节点信息提取为光泽中的反应变量]的可能副本(https://stackoverflow.com/questions/45217609/extracting-node-information-from-networkd3-to- a-reactive-variable-in-shiny) –

回答

0
  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) 
+0

它的确如此。如果我将节点链接到URL,则clickAction起作用。当我使用output $ table < - DT :: renderDataTable(DT :: datatable(get((input $ id)))时,它也可以工作所以我没有发现clickAction功能有任何问题感谢您的输入,但我正在寻找一个解决方案,我提到的错误,我试图将值传递给一个函数,它给出了错误“没有这样的列” – Poppin

+0

抱歉,你是对的,有点......我们最近做了'simpleNetwork()''forceNetwork()'的别名,所以它从'forceNetwork()'中获得了这个能力......看到我更新的答案 –

+0

它的工作原理!我用get()为了获得数据帧来自sqldf。现在我看到我要去的地方出错了。感谢很多! – Poppin