@@ -31,82 +31,57 @@ HTMLWidgets.widget({
31
31
Plotly . newPlot ( graphDiv , x . data , x . layout ) ;
32
32
}
33
33
34
- // send user input event data to shiny
35
- if ( shinyMode ) {
36
- graphDiv . on ( 'plotly_click' , function ( eventData ) {
37
- // extract only the data we may want to access in R
34
+ sendEventData = function ( eventType ) {
35
+ return function ( eventData ) {
36
+ if ( eventData === undefined || ! eventData . hasOwnProperty ( "points" ) ) {
37
+ return null ;
38
+ }
38
39
var d = eventData . points . map ( function ( pt ) {
39
40
var obj = {
40
- curveNumber : pt . curveNumber ,
41
- pointNumber : pt . pointNumber ,
42
- x : pt . x ,
43
- y : pt . y
41
+ curveNumber : pt . curveNumber ,
42
+ pointNumber : pt . pointNumber ,
43
+ x : pt . x ,
44
+ y : pt . y
44
45
} ;
45
- if ( pt . data . hasOwnProperty ( "key" ) ) {
46
- if ( typeof pt . pointNumber === "number" ) {
47
- obj . key = pt . data . key [ pt . pointNumber ] ;
48
- } else {
49
- obj . key = pt . data . key [ pt . pointNumber [ 0 ] ] [ pt . pointNumber [ 1 ] ] ;
50
- } // TODO: can pointNumber be 3D?
51
- }
52
- return obj ;
53
- } ) ;
54
- Shiny . onInputChange ( ".clientValue-plotly_click-" + x . source , d ) ;
55
- } ) ;
56
-
57
- // clear click selection
58
- graphDiv . on ( 'plotly_doubleclick' , function ( eventData ) {
59
- Shiny . onInputChange ( ".clientValue-plotly_click-" + x . source , null ) ;
60
- } ) ;
61
-
62
- graphDiv . on ( 'plotly_hover' , function ( eventData ) {
63
- // extract only the data we may want to access in R
64
- var d = eventData . points . map ( function ( pt ) {
65
- var obj = {
66
- curveNumber : pt . curveNumber ,
67
- pointNumber : pt . pointNumber ,
68
- x : pt . x ,
69
- y : pt . y
46
+ // grab the trace corresponding to this point
47
+ var tr = x . data [ pt . curveNumber ] ;
48
+ // add on additional trace info, if it exists
49
+ attachKey = function ( keyName ) {
50
+ if ( tr . hasOwnProperty ( keyName ) ) {
51
+ if ( typeof pt . pointNumber === "number" ) {
52
+ obj [ keyName ] = tr [ keyName ] [ pt . pointNumber ] ;
53
+ } else {
54
+ obj [ keyName ] = tr [ keyName ] [ pt . pointNumber [ 0 ] ] [ pt . pointNumber [ 1 ] ] ;
55
+ } // TODO: can pointNumber be 3D?
56
+ }
70
57
} ;
71
- if ( pt . data . hasOwnProperty ( "key" ) ) {
72
- if ( typeof pt . pointNumber === "number" ) {
73
- obj . key = pt . data . key [ pt . pointNumber ] ;
74
- } else {
75
- obj . key = pt . data . key [ pt . pointNumber [ 0 ] ] [ pt . pointNumber [ 1 ] ] ;
76
- } // TODO: can pointNumber be 3D?
77
- }
78
- return obj ;
58
+ attachKey ( "z" ) ;
59
+ attachKey ( "key" ) ;
60
+ return obj ;
79
61
} ) ;
80
- Shiny . onInputChange ( ".clientValue-plotly_hover-" + x . source , d ) ;
81
- } ) ;
82
-
83
- // clear hover selection
62
+ console . log ( d ) ;
63
+ Shiny . onInputChange ( ".clientValue-" + eventType + "-" + x . source , d ) ;
64
+ } ;
65
+ } ;
66
+
67
+ // send user input event data to shiny
68
+ if ( shinyMode ) {
69
+ graphDiv . on ( 'plotly_hover' , sendEventData ( 'plotly_hover' ) ) ;
70
+ graphDiv . on ( 'plotly_click' , sendEventData ( 'plotly_click' ) ) ;
71
+ graphDiv . on ( 'plotly_selected' , sendEventData ( 'plotly_selected' ) ) ;
84
72
graphDiv . on ( 'plotly_unhover' , function ( eventData ) {
85
73
Shiny . onInputChange ( ".clientValue-plotly_hover-" + x . source , null ) ;
86
74
} ) ;
87
-
88
- graphDiv . on ( 'plotly_selected' , function ( eventData ) {
89
- if ( eventData !== undefined ) {
90
- // convert the array of objects to object of arrays so this converts
91
- // to data frame in R as opposed to a vector
92
- var pts = eventData . points ;
93
- var obj = {
94
- curveNumber : pts . map ( function ( pt ) { return pt . curveNumber ; } ) ,
95
- pointNumber : pts . map ( function ( pt ) { return pt . pointNumber ; } ) ,
96
- x : pts . map ( function ( pt ) { return pt . x ; } ) ,
97
- y : pts . map ( function ( pt ) { return pt . y ; } )
98
- } ;
99
- Shiny . onInputChange ( ".clientValue-plotly_selected-" + x . source , obj ) ;
100
- }
75
+ graphDiv . on ( 'plotly_doubleclick' , function ( eventData ) {
76
+ Shiny . onInputChange ( ".clientValue-plotly_click-" + x . source , null ) ;
101
77
} ) ;
102
-
103
- // clear select/lasso selection & click
78
+ // 'plotly_deselect' is code for doubleclick when in select mode
104
79
graphDiv . on ( 'plotly_deselect' , function ( eventData ) {
105
80
Shiny . onInputChange ( ".clientValue-plotly_selected-" + x . source , null ) ;
106
81
Shiny . onInputChange ( ".clientValue-plotly_click-" + x . source , null ) ;
107
82
} ) ;
108
-
109
- } // shinyMode
110
- } // renderValue
83
+ }
84
+
85
+ }
111
86
112
87
} ) ;
0 commit comments