2016-04-04 15 views
3

Ben Shiny oluşturulmuş bir uygulamayı (ui.R ve server.R buradan alınır bir öğretici,: http://shiny.rstudio.com/tutorial/lesson1/) var. Bu iki dosyayı shiny-frontend klasöründe var ve RSTudio'da yerel olarak runApp("shiny-frontend") varsa, her şey harika çalışıyor ve tarayıcımda öğreticiyi görüyorum.Dağıtılan Rgör 'bulamadı fonksiyonu 'httpdPort''

Şimdi aynı uygulamanın Cloudfoundry aracılığıyla Bluemix'e yerleştirilmesini istiyorum. Bunu kullanıyorum: http://www.ibm.com/developerworks/library/ba-rtwitter-app/ Bir öğretici olarak, ancak bir hatayla mücadele ediyorum.

R -f ./start.r --gui-none --no-save olarak çalıştığım bir start.r dosyam var. https://github.com/virtualstaticvoid/heroku-buildpack-r buildpack kullanıyorum.

start.r (çok küçük değişikliklerle bluemix öğretici alınan) şöyle My:

library(shiny) 

if (Sys.getenv('VCAP_APP_PORT') == "") { 
    print("Running Shiny") 
    runApp("shiny-frontend") 
} else { 
    # In case we're on Cloudfoundry, run this: 
    print('running on CF') 

    # Starting Rook server during CF startup phase - after 60 seconds start the actual Shiny server 
    library(Rook) 
    myPort <- as.numeric(Sys.getenv('VCAP_APP_PORT')) 
    myInterface <- Sys.getenv('VCAP_APP_HOST') 
    status <- -1 

    # R 2.15.1 uses .Internal, but the next release of R will use a .Call. 
    # Either way it starts the web server. 
    if (as.integer(R.version[["svn rev"]]) > 59600) { 
    status <- .Call(tools:::startHTTPD, myInterface, myPort) 
    } else { 
    status <- .Internal(startHTTPD(myInterface, myPort)) 
    } 

    if (status == 0) { 
    unlockBinding("httpdPort", environment(tools:::startDynamicHelp)) 
    assign("httpdPort", myPort, environment(tools:::startDynamicHelp)) 

    s <- Rhttpd$new() 
    s$listenAddr <- myInterface 
    s$listenPort <- myPort 

    s$print() 
    Sys.sleep(60) 
    s$stop() 
    } 


    # run shiny server 
    sink(stderr()) 
    options(bitmapType='cairo') 
    getOption("bitmapType") 
    print("test") 
    write("prints to stderr", stderr()) 
    write("prints to stdout", stdout()) 
    write(port, stdout()) 
    runApp('shiny-frontend',port=myPort,host="0.0.0.0",launch.browser=F) 
} 

Ve init.r, şöyle görünür:

install.packages("shiny", clean=T) 
install.packages("Rook", clean=T) 

Sonra çalıştırdığınızda, her şeyi doğru şekilde dağıtıldı, ancak sonra rotaya gitmeye çalıştığımda, günlükte bir hata görüyorum:

Ayrıca, atanan bağlantı noktasının her seferinde farklı olduğunu da fark ettim, bu da tuhaf ve bluemix panosundaki rota bundan bahsetmiyor. Ama bağlantı noktasını kayıt defterine çıkardım ve bu numarayı kullanıyorum.

Ayrıca ben yapıyorum yolu herkes daha kolay bir yol önermek böylelikle eğer, bunu

cevap

2

takdir ediyorum, biraz fazla karmaşık görünüyor bu hata R tarafından atılır anlamak için biraz zaman aldı Çünkü işlevi (değer değil) httpdPort. Bir işleve httpdPort bağlanması yerine onu bir değere bağlarsınız. s$stop() numaralı hat, soruna neden olan çizgidir. Bu, httpdPort'un tools ortamında tanımlanan bir işlev olduğunu varsayan startDynamicHelp'u çağırır.

if (status == 0) { 
    getSettable <- function(default){ 
         function(obj = NA){if(!is.na(obj)){default <<- obj}; 
            default} 
        } 
    myHttpdPort <- getSettable(myPort) 
    unlockBinding("httpdPort", environment(tools:::startDynamicHelp)) 
    assign("httpdPort", myHttpdPort, environment(tools:::startDynamicHelp)) 

    s <- Rhttpd$new() 
    s$listenAddr <- myInterface 
    s$listenPort <- myPort 

    s$print() 
    Sys.sleep(60) 
    s$stop() 
} 
:

Eğer için kodunuzda bloğu if (status == 0){...} değiştirebilir Bu sorunu çözmek için