2017-08-08 36 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