2016-05-01 65 views
0

我剛剛用rcpp,我的rcpp函數有問題,當我直接運行App時,程序顯示錯誤找不到函數「krit」。但是當我運行部分功能CTRL + R,然後運行應用程序運行良好。有沒有一個從rcpp函數中調用R函數的代碼在閃亮,我不能部分運行該函數?換句話說,當我直接運行應用程序的閃亮將運行良好。這是示例代碼...Rcpp - 如何從Rcpp函數中調用R函數Shiny

服務器

library(shiny) 
library(Rcpp) 
krit <- function(n){ 
    mat <- matrix(1,n,1) 
    return(mat) 
} 
cppFunction(' 
      NumericMatrix tes1(int n){ 
      Function krit("krit"); 
      NumericMatrix test = krit(n+1); 
      return(test); 
      } 
      ') 

shinyServer(function(input, output) { 

    output$testing <- renderUI({ 
    list(
    renderPrint(tes1(3)) 
    ) 
    }) 

}) 

UI

library(shiny) 
shinyUI(fluidPage(
    titlePanel("Shiny Text"), 
    sidebarLayout(
    sidebarPanel(

    ), 
    mainPanel(

     uiOutput("testing") 
    ) 
) 
)) 
+0

可能與http://stackoverflow.com/問題/ 21225662 /調用用戶定義的r函數從c-using-rcpp – r2evans

+0

我將我需要的代碼放到_packages_中,以避免這個問題。 –

回答

2

這是關於如何shinyRcpp查看不同的環境,一個範圍問題。

發生了什麼事是與訪問使用全球環境的問題...

1)標準Rcpp::Function魔術

Rcpp::Function krit("krit"); 

2)Rcpp::Environment與全球拉力產生缺失值。

Rcpp::Environment env = Environment::global_env(); 
Rcpp::Function krit = env("krit"); 

錯誤:

file3d3f43b856e05.cpp:9:45: error: no match for call to '(Rcpp::Environment) (const char [5])'

因此,可以做,以解決這個範圍界定問題,最好是通過您要使用到編譯的C++函數,並把它叫做R函數。例如

NumericMatrix tes1(int n, Rcpp::Function krit) 

或者,你將需要修改server.R到:

library(shiny) 
library(Rcpp) 

krit <- function(n){ 
    mat <- matrix(1,n,1) 
    return(mat) 
} 

cppFunction(' 
      // Added krit as a function pass 
      NumericMatrix tes1(int n, Rcpp::Function krit){ 
      NumericMatrix test = krit(n+1); 
      return(test); 
      } 
      ') 

shinyServer(function(input, output) { 

    output$testing <- renderUI({ 
    list(
     # Added parameter to `tes1` to pass in krit. 
     renderPrint(tes1(n = 3, krit = krit)) 
    ) 
    }) 

}) 

因此,你應該得到:

shiny_text

+0

非常感謝你,這是工作......:D – lukman