2016-05-01 13 views
0

Ich bin gerade neu mit RCP, ich habe ein Problem mit meiner RCPP-Funktion, wenn ich direkt App ausführen, konnte die Programmanzeige Fehler Funktion "krit" nicht finden. aber wenn ich die Funktion teilweise mit STRG + R ausführen und dann App ausführen, läuft das Programm gut. Gibt es einen Code für Call-R-Funktion von rcpp Funktion in glänzend, dass ich die Funktion nicht teilweise ausführen müssen? Mit anderen Worten, wenn ich App direkt starte, läuft der glänzende Wille gut. dies ist der Beispielcode ...Rcpp - wie R-Funktion von Rcpp Funktion in Shiny

Server

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

möglicherweise im Zusammenhang mit http://stackoverflow.com/ Fragen/21225662/calling-a-user-defined-r-function-from-c-using-rcpp – r2evans

+0

Ich lege den Code, den ich für unsere verschiedenen glänzenden Apps benötige, in _packages_, was das Problem vermeidet. –

Antwort

2

Dies ist eine Scoping-Frage in Bezug auf, wie shiny und Rcpp die verschiedenen Umgebungen anzuzeigen.

Was passiert, ist ein Problem mit der globalen Umwelt Zugriff mit ...

1) Standard Rcpp::Function Magie

Rcpp::Function krit("krit"); 

2) Rcpp::Environment mit einem globalen Pull ergibt einen fehlenden Wert.

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

Fehler:

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

So das Beste, was dieses Scoping Problem getan werden kann, zu lösen, ist die R-Funktion übergeben, die Sie in die kompilierten C++ Funktion verwenden mögen, und es nennt. z.B.

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

Oder müssen Sie die server.R ändern:

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)) 
    ) 
    }) 

}) 

Daher sollten Sie erhalten:

shiny_text

+0

vielen Dank, es ist Arbeit ...: D – lukman