2015-11-26 8 views
9

Vogliamo visualizzare un htmlwidget all'interno di un'applicazione OpenCPU. L'html è generato da Leaflet senza problemi, tuttavia abbiamo alcuni problemi a visualizzarlo all'interno dell'app OpenCPU. Abbiamo usato la seguente funzione per generare il foglio Mappa:come visualizzare htmlwidgets all'interno di app openCPU?

leafmap1 <- function(ecoregion='10105',wdpa_id='1500'){ 
require(leaflet) 
require(shiny) 
require(htmlwidgets) 
m <- leaflet() %>% 
addTiles() %>% # Add default OpenStreetMap map tiles 
addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R") 
m 
} 

Il JavaScript è la seguente:

function SochiCtrl($scope){ 
$scope.ecoregions = ['10105'] 
$scope.wdpa_ids = ["1500"] 
$scope.ecoregion = $scope.ecoregions[0] 
$scope.wdpa_id = $scope.wdpa_ids[0]  
$scope.makeChart = function(){ 
    var req = ocpu.rpc("leafmap1", 
    {"ecoregion": $scope.ecoregion, "wdpa_id": $scope.wdpa_id}, function(output){ 
    $('#map').html(output) 
    }).fail(function(text){ 
    alert("Error: " + req.responseText); 
    }); 
} 
$scope.$watchCollection('[ecoregion, wdpa_id]', function(newValues){ 
    console.log(newValues) 
    $scope.makeChart({ecoregion: newValues[0], wdpa_id: newValues[1]}) 
}) 
} 

Ora l'applicazione mostra il telaio di foglietto, ma ho alcuni problemi per ottenere il JSON da OpenCPU ho ottenuto il seguente errore Nessun metodo asJSON Classe S3: htmlwidget. Ho anche provato con:

m <- toJSON(m, force= TRUE) 

ma non sembra funzionare.
enter image description here

Il codice completo è disponibile al numero: https://github.com/Arevaju/ocpuleaflet.

Grazie mille per il vostro aiuto e congratulazioni per il vostro ottimo lavoro !!

+0

Puoi includere qualche esempio di codice di un widget che desideri visualizzare? – Jeroen

+0

Nessuna soluzione trovata? – YCR

+1

Sì, dai un'occhiata a questo repo di Jeroen: https://github.com/opencpu/leafletapp. Troverete l'app sul sito web di OpenCPU. Il nostro esempio di lavoro può essere trovato su: https://github.com/javimarlop/spdynmodocpu – arevaju

risposta

1

Mi dispiace perché non è una risposta testata, ma è più facile spiegare un approccio proposto qui che in un commento.

Quello che propongo è che la funzione leafmap1 restituisca testo semplice (HTML) anziché l'oggetto volantino.

Si può vedere che l'oggetto volantino eredita la classe htmlwidget. Per questa classe esiste un metodo per la funzione generica toHTML che consente il recupero di tale codice HTML.

assunto un oggetto foglio:

m = leaflet() %>% addTiles() 

Diamo uno sguardo a sua classe:

class(m) 
[1] "leaflet" "htmlwidget" 

Prendi il sottostante codice HTML generato:

> (out <- unclass(htmlwidgets:::toHTML(m))) 
[[1]] 
<div id="htmlwidget-7863" style="width:100%;height:400px;" class="leaflet html-widget"></div> 
[[2]] 
<script type="application/json" data-for="htmlwidget-7863">{"x":{"calls":[{"method":"addTiles","args": ["http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",null,null,{"minZoom":0,"maxZoom":18,"maxNativeZoom":null,"tileSize":256,"subdomains":"abc","errorTileUrl":"","tms":false,"continuousWorld":false,"noWrap":false,"zoomOffset":0,"zoomReverse":false,"opacity":1,"zIndex":null,"unloadInvisibleTiles":null,"updateWhenIdle":null,"detectRetina":false,"reuseTiles":false,"attribution":"&copy; <a href=\"http://openstreetmap.org\">OpenStreetMap\u003c/a> contributors, <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA\u003c/a>"}]}]},"evals":[],"jsHooks":[]}</script> 
[[3]] 
NULL 
attr(,"html_dependencies") 
attr(,"html_dependencies")[[1]] 
[...] 

Terzo slot contiene dipendenze (javascript + css) quindi immagino che siano già stati caricati nel tuo rapporto.

Potete restituire la concatenazione dei primi due componenti (risultato della funzione):

return(paste(out[[1]], out[[2]], sep="\n")) 
+0

Bello, ma come si include l'html nel proprio script? Ti dispiace preciso il js call sul lato client? – YCR

+0

Ho lavorato solo una volta con opencpu, anni fa. Aggiunge in HTML un elemento div e ne aggiunge il risultato? Sich come '$ ('# risultati'). Append ("
");' (disponibile all'indirizzo http://stackoverflow.com/questions/11418535/how-to-call-an-self-designed-r-function- on-opencpu-via-javascript) –

+0

sessione provata.getObject (function (OUTTXT) { \t \t \t $ ("# mio_div") del testo (OUTTXT);. \t \t}); e

e non ha funzionato. Forse in un modo che non conosco. – YCR

Problemi correlati