@@ -8,137 +8,142 @@ for (expr in exprs) {
8
8
eval(expr , env )
9
9
}
10
10
11
- # r <- callr::r_session$new(
12
- # callr::r_session_options(
13
- # system_profile = TRUE, user_profile = TRUE, supervise = TRUE),
14
- # wait = TRUE
15
- # )
11
+ r <- callr :: r_session $ new(
12
+ callr :: r_session_options(
13
+ system_profile = TRUE , user_profile = TRUE , supervise = TRUE ),
14
+ wait = TRUE
15
+ )
16
16
17
- # r$run(function() {
18
- # requireNamespace("jsonlite")
19
- # requireNamespace("svglite")
17
+ r $ run(function () {
18
+ requireNamespace(" jsonlite" )
19
+ requireNamespace(" svglite" )
20
20
21
- # .vscNotebook <- local({
22
- # null_dev_id <- c(pdf = 2L)
23
- # null_dev_size <- c(7 + pi, 7 + pi)
24
- # viewer_file <- NULL
25
- # browser_url <- NULL
21
+ .vscNotebook <- local({
22
+ null_dev_id <- c(pdf = 2L )
23
+ null_dev_size <- c(7 + pi , 7 + pi )
24
+ viewer_file <- NULL
25
+ browser_url <- NULL
26
26
27
- # options(
28
- # device = function(...) {
29
- # pdf(NULL,
30
- # width = null_dev_size[[1L]],
31
- # height = null_dev_size[[2L]],
32
- # bg = "white")
33
- # dev.control(displaylist = "enable")
34
- # },
35
- # viewer = function(url, ...) {
36
- # write_log("viewer: ", url)
37
- # viewer_file <<- url
38
- # },
39
- # page_viewer = function(url, ...) {
40
- # write_log("page_viewer: ", url)
41
- # viewer_file <<- url
42
- # },
43
- # browser = function(url, ...) {
44
- # write_log("browser: ", url)
45
- # browser_url <<- url
46
- # }
47
- # )
27
+ options(
28
+ device = function (... ) {
29
+ pdf(NULL ,
30
+ width = null_dev_size [[1L ]],
31
+ height = null_dev_size [[2L ]],
32
+ bg = " white" )
33
+ dev.control(displaylist = " enable" )
34
+ },
35
+ viewer = function (url , ... ) {
36
+ write_log(" viewer: " , url )
37
+ viewer_file <<- url
38
+ },
39
+ page_viewer = function (url , ... ) {
40
+ write_log(" page_viewer: " , url )
41
+ viewer_file <<- url
42
+ },
43
+ browser = function (url , ... ) {
44
+ write_log(" browser: " , url )
45
+ browser_url <<- url
46
+ }
47
+ )
48
48
49
- # check_null_dev <- function() {
50
- # identical(dev.cur(), null_dev_id) &&
51
- # identical(dev.size(), null_dev_size)
52
- # }
49
+ check_null_dev <- function () {
50
+ identical(dev.cur(), null_dev_id ) &&
51
+ identical(dev.size(), null_dev_size )
52
+ }
53
53
54
- # evaluate <- function(expr) {
55
- # tryCatch({
56
- # out <- withVisible(eval(expr, globalenv()))
57
- # text <- utils::capture.output(print(out$value, view = TRUE))
58
- # if (check_null_dev()) {
59
- # record <- recordPlot()
60
- # plot_file <- tempfile(fileext = ".svg")
61
- # svglite::svglite(plot_file, width = 12, height = 8)
62
- # replayPlot(record)
63
- # graphics.off()
64
- # res <- list(
65
- # type = "plot",
66
- # result = plot_file
67
- # )
68
- # } else if (!is.null(viewer_file)) {
69
- # res <- list(
70
- # type = "viewer",
71
- # result = viewer_file
72
- # )
73
- # } else if (!is.null(browser_url)) {
74
- # res <- list(
75
- # type = "browser",
76
- # result = browser_url
77
- # )
78
- # } else if (out$visible) {
79
- # res <- list(
80
- # type = "text",
81
- # result = paste0(text, collapse = "\n")
82
- # )
83
- # } else {
84
- # res <- list(
85
- # type = "text",
86
- # result = ""
87
- # )
88
- # }
89
- # })
54
+ evaluate <- function (id , uri , expr ) {
55
+ tryCatch({
56
+ expr <- parse(text = expr )
57
+ out <- withVisible(eval(expr , globalenv()))
58
+ text <- utils :: capture.output(print(out $ value , view = TRUE ))
59
+ if (check_null_dev()) {
60
+ record <- recordPlot()
61
+ plot_file <- tempfile(fileext = " .svg" )
62
+ svglite :: svglite(plot_file , width = 12 , height = 8 )
63
+ replayPlot(record )
64
+ graphics.off()
65
+ res <- list (
66
+ type = " plot" ,
67
+ result = plot_file
68
+ )
69
+ } else if (! is.null(viewer_file )) {
70
+ res <- list (
71
+ type = " viewer" ,
72
+ result = viewer_file
73
+ )
74
+ } else if (! is.null(browser_url )) {
75
+ res <- list (
76
+ type = " browser" ,
77
+ result = browser_url
78
+ )
79
+ } else if (out $ visible ) {
80
+ res <- list (
81
+ type = " text" ,
82
+ result = paste0(text , collapse = " \n " )
83
+ )
84
+ } else {
85
+ res <- list (
86
+ type = " text" ,
87
+ result = " "
88
+ )
89
+ }
90
+ }, error = function (e ) {
91
+ res <- list (
92
+ type = " error" ,
93
+ result = conditionMessage(e )
94
+ )
95
+ })
90
96
91
- # res
92
- # }
97
+ c( id = id , uri = uri , res )
98
+ }
93
99
94
- # environment()
95
- # })
100
+ environment()
101
+ })
96
102
97
- # attach(environment(), name = "tools:vscNotebook")
98
- # NULL
99
- # })
103
+ attach(environment(), name = " tools:vscNotebook" )
104
+ NULL
105
+ })
100
106
101
107
con <- socketConnection(host = " 127.0.0.1" , port = env $ port , open = " r+b" )
102
108
103
- request_id <- 0L
104
109
while (TRUE ) {
110
+ response <- NULL
105
111
if (socketSelect(list (con ), timeout = 0 )) {
106
112
header <- readLines(con , 1 , encoding = " UTF-8" )
107
113
n <- as.integer(gsub(" ^Content-Length\\ : (\\ d+)$" , " \\ 1" , header ))
108
114
content <- readChar(con , n , useBytes = TRUE )
109
115
Encoding(content ) <- " UTF-8"
110
- cat(" request " , request_id , " : " , content , " \n " , sep = " " )
111
- request_id <- request_id + 1L
116
+ cat(content , " \n " , sep = " " )
117
+
118
+ request <- jsonlite :: fromJSON(content , simplifyVector = FALSE )
119
+ response <- tryCatch({
120
+ r $ call(function (id , uri , expr ) {
121
+ .vscNotebook $ evaluate(id , uri , expr )
122
+ }, request )
123
+ NULL
124
+ }, error = function (e ) {
125
+ list (
126
+ id = request $ id ,
127
+ uri = request $ uri ,
128
+ type = " error" ,
129
+ result = conditionMessage(e )
130
+ )
131
+ })
112
132
}
113
- Sys.sleep(0.1 )
114
- }
115
133
116
- # while (TRUE) {
117
- # write_log("Listening on port: ", env$port)
118
- # con <- try(socketConnection(host = "127.0.0.1", port = env$port,
119
- # blocking = TRUE, server = TRUE,
120
- # open = "r+"), silent = TRUE)
121
- # if (inherits(con, "try-error")) {
122
- # message(con)
123
- # } else {
124
- # tryCatch({
125
- # line <- readLines(con, n = 1)
126
- # write_log(line)
127
- # request <- jsonlite::fromJSON(line)
134
+ result <- r $ read()
135
+ if (! is.null(result )) {
136
+ if (is.list(result $ result )) {
137
+ response <- result $ result
138
+ } else if (! is.null(result $ error )) {
139
+ message(result $ error )
140
+ }
141
+ }
128
142
129
- # str <- tryCatch({
130
- # expr <- parse(text = request$expr)
131
- # }, error = function(e) {
132
- # list(
133
- # type = "error",
134
- # result = conditionMessage(e)
135
- # )
136
- # }
137
- # )
138
- # response <- jsonlite::toJSON(str, auto_unbox = TRUE, force = TRUE)
139
- # writeLines(response, con)
140
- # }, error = function(e) {
141
- # message(e)
142
- # }, finally = close(con))
143
- # }
144
- # }
143
+ if (! is.null(response )) {
144
+ response <- jsonlite :: toJSON(result $ result ,
145
+ auto_unbox = TRUE , force = TRUE )
146
+ writeLines(response , con )
147
+ }
148
+ Sys.sleep(0.1 )
149
+ }
0 commit comments