knitr::opts_chunk$set(echo = FALSE) library(svgR)
In what follows steps 1-3 address server to client, steps 4-6 address client to server. Step 7 involves client to server back to client.
box %<c-% function(pos, i, headTxt, fill, valTxt, valTxt2=NULL, valTxt3=NULL ){ g( rect( xy=pos$rectXY[,i], wh=pos$rectWH[,i], fill=fill, stroke='blue', stroke.width=3 ), text(headTxt, xy=pos$headXY[,i], stroke='blue' ), text(valTxt, xy=pos$txt1XY[,i] ), if(!is.null(valTxt2)){ text(valTxt2, xy=pos$txt2XY[,i] ) } else { NULL }, if(!is.null(valTxt3)){ text(valTxt3, xy=pos$txt3XY[,i] ) } else { NULL } ) } dimInit<-function(rectH){ sep<-5 rectW<-250 rectY<-cumsum(c(0,rectH)+sep) rectXY<-rbind(100,rectY) rectWH<-rbind(250,rectH) headXY<-c(10,20)+rectXY txt1XY<-c(30,20)+headXY txt2XY<-c(0,20)+txt1XY txt3XY<-c(0,20)+txt2XY WH<-c(400,sum(rectH)+(1+length(rectH))*sep) list( rectXY=rectXY, rectWH=rectWH, headXY=headXY, txt1XY=txt1XY, txt2XY=txt2XY, txt3XY=txt3XY, WH=WH ) } rectH<-c(90,50) pos<-dimInit(rectH) WH<-pos$WH WH<-c(400,200) svgR(wh=WH,text('STEP 1',xy=c(20,20)), box(pos, 1, 'shinyInputControl_svg.R', '#BBFFBB','add to parms', 'edit svgR','commit svg'), box(pos, 2, 'app.R', '#FFCCAA','run to test') )
rectH<-c(50,70,70,50) pos<-dimInit(rectH) WH<-pos$WH svgR(wh=WH, text('STEP 2',xy=c(20,20)), box(pos, 1, 'app.R', 'pink','edit intialValue'), box(pos, 2, 'shinyInputControl.R', 'lightyellow','edit shinyInputControl()'), box(pos, 3, 'shinyInputControl.js', 'lightblue','edit shinyInputControl()'), box(pos, 4, 'app.R', '#FFCCAA','run to test') )
2. do any needed processing of value - for example, *if a value represents an object*, then convert to object - Hint use: ```r library(svgR) WH<-c(48,32) ptR<-list( x=matrix(0,2,0) ) r=WH[2]/3 lft=WH[1]/2-1.5*r top<-WH[2]/2-r bot<-WH[2]/2+r svgR(wh=WH, rect( xy=c(0,0), wh=WH, fill='black'), polygon(points=WH*c(c(.05,.5), c(.15,.3),c(.15,.7)),fill='#00FFFF'), rect(cxy=WH*c(.2,.5), wh=WH*c(.1,.1),fill="#00FFFF"), circle( cxy=WH/2, r=WH[2]/3, stroke='none', fill='#00FFFF' ), path( d=list( M=c(.4,.8)*WH, C=c( c(.6,1.2),c(.9,.2), c(.8,.9))*WH ), stroke='#00FFFF', stroke.width=1, fill='none' ), g( lapply(1:3, function(i){ ellipse(cxy=WH*c(.5, .1), rxy=i*c(8,3), fill='none', stroke='#000000', stroke.width=.5) }), mask=mask(circle(cxy=WH/2, r=WH[2]/3), fill='white' ) ), g( lapply(1:5, function(i){ ellipse(cxy=WH*c(.7, .5), rxy=i*c(3,5), fill='none', stroke='#000000', stroke.width=.5) }), mask=mask( circle(cxy=WH/2, r=WH[2]/3, fill='white'), ellipse(cxy=WH*c(.5, .1), rxy=3*c(8,3), fill='black') ) ), g( lapply(1:5, function(i){ ellipse(cxy=WH*c(.3, .3), rxy=i*c(3,5), fill='none', stroke='#000000', stroke.width=.5) }), mask=mask( circle(cxy=WH/2, r=WH[2]/3, fill='white'), ellipse(cxy=WH*c(.5, .1), rxy=3*c(8,3), fill='black'), ellipse(cxy=WH*c(.7, .5), rxy=5*c(3,5), fill='black') ) ) )
3. set data-value - Hint use:
library(svgR) WH<-c(48,32) R<-.06*WH[1] d<-list(M=WH*c(.8,.85), Q=WH*c(c(.12,.85),c(.12,.52))) svgR(wh=WH, #stroke.width=1, stroke="#00FFFF", fill="none", rect( xy=c(0,0), wh=WH, fill='black'), polygon(points=WH*c(c(.25,.5), c(.15,.3),c(.15,.7)),fill='#00FFFF'), rect(cxy=WH*c(.1,.5), wh=WH*c(.1,.1),fill="#00FFFF"), lapply(1:5, function(i){ ellipse( cxy=c(.6, .8-i*.1)*WH, rxy=c(.2,.1)*WH, stroke='black', fill='#00FFFF', stroke='black', stroke.width=.5 ) }) )
- if value is a character string, nothing need be done
rectH<-c(70,90,90,50) pos<-dimInit(rectH) WH<-pos$WH svgR(wh=WH, text('STEP 3',xy=c(20,20)), box(pos, 1, 'app.R', 'pink','edit observer for update'), box(pos, 2, 'shinyInputControl.R', 'lightyellow','recreate svgTree', 'create & send message'), box(pos, 3, 'shinyInputControl.js', 'lightblue','extract value and set element', 'extract and replace tree'), box(pos, 4, 'app.R', '#FFCCAA','run to test') )
library(svgR) WH<-c(48,32) X=c(.2,.4,.6,.8) svgR(wh=WH, stroke.width=3, stroke="#00FFFF", fill="#00FFFF", rect( xy=c(0,0), wh=WH, fill='black'), line(xy1=WH*c(.1,.1), xy2=WH*c(.9,.1) ), line(xy1=WH*c(.1,.23), xy2=WH*c(.9,.23) ), line(xy1=WH*c(.5,.4), xy2=WH*c(.5,.9) ), polygon(points=WH*c( .5,.3, .7,.5, .3,.5)) )
library(svgR) WH<-c(48,32) svgR(wh=WH, rect(xy=c(0,0), wh=WH, fill='black'), text(cxy=WH/2, "Xval", stroke='#00FFFF', fill='#00FFFF') )
2. If needed, convert to object: i.e. value=JSON.parse(value); - Hint use:
library(svgR) WH<-c(48,32) r=WH[2]/3 lft=WH[1]/2-1.5*r top<-WH[2]/2-r bot<-WH[2]/2+r svgR(wh=WH, rect(xy=c(0,0),wh=WH, fill='black'), polygon(points=WH*c(c(.05,.5), c(.15,.3),c(.15,.7)),fill='#00FFFF'), rect(cxy=WH*c(.2,.5), wh=WH*c(.1,.1),fill="#00FFFF"), circle( cxy=WH/2, r=WH[2]/3, stroke='none', fill='#00FFFF' ), path( d=list( M=c(.4,.8)*WH, C=c( c(.6,1.2),c(.9,.2), c(.8,.9))*WH ), stroke='#00FFFF', stroke.width=1, fill='none' ), g( lapply(1:3, function(i){ ellipse(cxy=WH*c(.5, .1), rxy=i*c(8,3), fill='none', stroke='#000000', stroke.width=.5) }), mask=mask(circle(cxy=WH/2, r=WH[2]/3), fill='white' ) ), g( lapply(1:5, function(i){ ellipse(cxy=WH*c(.7, .5), rxy=i*c(3,5), fill='none', stroke='#000000', stroke.width=.5) }), mask=mask( circle(cxy=WH/2, r=WH[2]/3, fill='white'), ellipse(cxy=WH*c(.5, .1), rxy=3*c(8,3), fill='black') ) ), g( lapply(1:5, function(i){ ellipse(cxy=WH*c(.3, .3), rxy=i*c(3,5), fill='none', stroke='#000000', stroke.width=.5) }), mask=mask( circle(cxy=WH/2, r=WH[2]/3, fill='white'), ellipse(cxy=WH*c(.5, .1), rxy=3*c(8,3), fill='black'), ellipse(cxy=WH*c(.7, .5), rxy=5*c(3,5), fill='black') ) ) )
3. set element with new data - this.setValue(\$(el), value); - Hint use:
library(svgR) WH<-c(48,32) svgR(wh=WH, rect(xy=c(0,0), wh=WH, fill='black'), text(cxy=WH/2, "Sval", stroke='#00FFFF', fill='#00FFFF') )
4. update svg rendering by replacing the entire svgTree under the $(el) - let node=data.node; - \$(el).empty().append(node); //this replaces the svgTree - Hint use:
``` {r, results='asis'} library(svgR) WH<-c(48,32) R<-.06WH[1] d<-list(M=WHc(.2,.42), Q=WH*c(c(.2,.8),c(.5,.8)))
svgR(wh=WH, stroke.width=2, stroke="#00FFFF", fill="none", rect(xy=c(0,0), wh=WH, fill='black'), text(xy=WHc(.16,.38),'svg', stroke.width=1, fill="#00FFFF"), ellipse(cxy=WH(c(1,1)-c(.2,.55)), rxy=Rc(2,1), fill="#00FFFF"), line(xy1=WH(c(1,1)-c(.2,.1)), xy2=WH(c(1,1)-c(.2,.3)) ), line(xy1=WH(c(1,1)-c(.2,.3)), xy2=WH(c(1,1)-c(.25,.5)),stroke.width=1.5 ), line(xy1=WH(c(1,1)-c(.2,.3)), xy2=WH*(c(1,1)-c(.15,.5)),stroke.width=1.9 ), path(d=d, stroke="#00FFFF", marker.end=marker(viewBox=c(0, 0, 10, 10), refXY=c(1,5), stroke.width=1, fill="#00FFFF", markerWidth=4, markerHeight=5, orient="auto", path( d=c("M", 0, 0, "L", 9, 5, "L", 0, 9, "z") ) ) ) )
4. In **App.R** validate that *updateshinyInputControl* works: - the appearance changes - value changes ### 4. Adding mouse events ```r rectH<-c(70,50) pos<-dimInit(rectH) WH<-pos$WH svgR(wh=WH,text('STEP 4',xy=c(20,20)), box(pos, 1, 'shinyInputControl_svg.R', '#BBFFBB','add mouse events'), box(pos, 2, 'app.R', '#FFCCAA','run to test') )
library(svgR) WH<-c(48,32) R<-WH[1]*.2 CXY=WH*c(.3,.5) svgR(wh=WH, stroke="#00FFFF", fill="none", rect(xy=c(0,0), wh=WH, fill='black'), g( polygon( points=c(WH)*c( c(.0,.0),c(.2,.5), c(.05,.3), c(.05,.6), c(-.05,.6),c(-.05,.3), c(-.2,.5) ), stroke="#00FFFF" ), lapply(c(0,45,135,180), function(theta){ line(xy1=c(.1,0)*WH, xy2=c(.3,0)*WH, stroke="#00FFFF", transform=list(rotate=-theta) ) }), transform=list( translate=WH*c(.6,.45), rotate=65) ) )
rectH<-c(70,70,50) pos<-dimInit(rectH) WH<-pos$WH svgR(wh=WH,text('STEP 5',xy=c(20,20)), box(pos, 1, 'shinyInputControl.js', 'lightblue','add clicked:'), box(pos, 2, 'shinyInputControl.R', 'lightyellow','edit params$CMDS'), box(pos, 3, 'app.R', '#FFCCAA','run to test') )
- typically this will - if needed: - convert id to el (el='#'+id) - make a call to **this.getValue(el)** - do something - make a call to **this.setValue(el, value)** - Hint use: ```r library(svgR) WH<-c(48,32) svgR(wh=WH, rect(xy=c(0,0), wh=WH, fill='black'), text(cxy=WH/2, "Sval", stroke='#00FFFF', fill='#00FFFF') )
library(svgR) WH<-c(48,32) ptR<-list( x=matrix(0,2,0) ) R<-WH[1]*.2 CXY=WH*c(.3,.5) svgR(wh=WH, stroke="#00FFFF", fill="none", rect(xy=c(0,0), wh=WH, fill='black'), text(xy=c(.05,.3)*WH,'CMDS', font.size=9), g( polygon( points=c(WH)*c( c(.0,.0),c(.2,.5), c(.05,.3), c(.05,.6), c(-.05,.6),c(-.05,.3), c(-.2,.5) ), stroke="#00FFFF" ), lapply(c(0,45,135), function(theta){ line(xy1=c(.1,0)*WH, xy2=c(.3,0)*WH, stroke="#00FFFF", transform=list(rotate=-theta) ) }), transform=list( translate=WH*c(.6,.45), rotate=65) ) )
rectH<-c(70,50) pos<-dimInit(rectH) WH<-pos$WH svgR(wh=WH,text('STEP 6',xy=c(20,20)), box(pos, 1, 'shinyInputControl.R', 'lightyellow','registerInputHandler'), box(pos, 2, 'app.R', '#FFCCAA','run to test') )
rectH<-c(70,50) pos<-dimInit(rectH) WH<-pos$WH svgR(wh=WH,text('STEP 7',xy=c(20,20)), box(pos, 1, 'shinyInputControl.R', 'lightyellow','add to registerInputHandler', 'updateshinyInputControl(...)'), box(pos, 2, 'app.R', '#FFCCAA','run to test') )
library(svgR) WH<-c(48,32) ptR<-list( x=matrix(0,2,0) ) svgR(wh=WH, stroke.width=3, stroke="#00FFFF", fill="#00FFFF", rect(xy=c(0,0), wh=WH, fill='black'), line(xy1=WH*c(.1,.1), xy2=WH*c(.9,.1) ), line(xy1=WH*c(.1,.23), xy2=WH*c(.9,.23) ), polygon(points=WH*c( .5,.3, .7,.5, .3,.5)), polyline(points=WH*c(.1, .5, .1,.85, .5,.85, .5,.4 ) , fill="none") )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.