Skip to content

Commit 5352b9c

Browse files
committed
Update notebook2
1 parent 6180ea9 commit 5352b9c

File tree

2 files changed

+72
-26
lines changed

2 files changed

+72
-26
lines changed

R/notebook2.R

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,30 @@ r <- callr::r_session$new(
1414
wait = TRUE
1515
)
1616

17+
r$call(function() {
18+
for (i in 1:1000) {
19+
x <- rnorm(1000000)
20+
y <- rnorm(1000000)
21+
m <- lm(y ~ x)
22+
summary(m)
23+
}
24+
})
25+
r$interrupt()
26+
27+
while (TRUE) {
28+
res <- r$read()
29+
if (!is.null(res)) {
30+
print(res)
31+
break
32+
}
33+
}
34+
35+
36+
r$call(function() print(1))
37+
r$read()
38+
r$get_state()
39+
r$get_status()
40+
1741
r$run(function() {
1842
requireNamespace("jsonlite")
1943
requireNamespace("svglite")
@@ -115,19 +139,32 @@ while (TRUE) {
115139
cat(content, "\n", sep = "")
116140

117141
request <- jsonlite::fromJSON(content, simplifyVector = FALSE)
118-
response <- tryCatch({
119-
r$call(function(id, uri, expr) {
120-
.vscNotebook$evaluate(id, uri, expr)
121-
}, request)
122-
NULL
123-
}, error = function(e) {
124-
list(
125-
id = request$id,
126-
uri = request$uri,
127-
type = "error",
128-
result = conditionMessage(e)
129-
)
130-
})
142+
if (request$type == "eval") {
143+
response <- tryCatch({
144+
r$call(function(id, uri, expr) {
145+
.vscNotebook$evaluate(id, uri, expr)
146+
}, request)
147+
NULL
148+
}, error = function(e) {
149+
list(
150+
id = request$id,
151+
uri = request$uri,
152+
type = "error",
153+
result = conditionMessage(e)
154+
)
155+
})
156+
} else if (request$type == "cancel") {
157+
if (r$interrupt()) {
158+
response <- list(
159+
id = request$id,
160+
uri = request$uri,
161+
type = "cancel",
162+
result = "cancelled"
163+
)
164+
} else {
165+
166+
}
167+
}
131168
}
132169

133170
result <- r$read()

src/notebook.ts

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@ import { spawn, ChildProcess } from 'child_process';
44
import { dirname } from 'path';
55
import * as fs from 'fs';
66

7-
interface REvalOutput {
7+
interface RSessionRequest {
88
id: number;
99
uri: string;
10-
type: 'text' | 'plot' | 'viewer' | 'browser' | 'error' | 'cancelled';
10+
type: 'eval' | 'cancel';
11+
args: any;
12+
}
13+
14+
interface RSessionResponse {
15+
id: number;
16+
uri: string;
17+
type: 'text' | 'plot' | 'viewer' | 'browser' | 'error' | 'cancel';
1118
result: string;
1219
}
1320

@@ -32,10 +39,9 @@ class RKernel {
3239
}
3340
}
3441

35-
private async handleResponse(response: REvalOutput) {
42+
private async handleResponse(response: RSessionResponse) {
3643
const cell = this.doc.cells.find((cell) => cell.metadata.executionOrder == response.id);
3744
if (cell) {
38-
cell.metadata.runnable = true;
3945
cell.metadata.runState = vscode.NotebookCellRunState.Success;
4046
cell.metadata.lastRunDuration = +new Date() - cell.metadata.runStartTime;
4147

@@ -97,13 +103,6 @@ class RKernel {
97103
this.socket = socket;
98104
resolve(undefined);
99105

100-
socket.on('data', (chunk: Buffer) => {
101-
const str = chunk.toString();
102-
console.log(`socket (${socket.localAddress}:${socket.localPort}): ${str}`);
103-
const response: REvalOutput = JSON.parse(str);
104-
this.handleResponse(response);
105-
});
106-
107106
socket.on('end', () => {
108107
console.log('socket disconnected');
109108
this.socket = undefined;
@@ -150,10 +149,21 @@ class RKernel {
150149
this.request({
151150
id: cell.metadata.executionOrder,
152151
uri: cell.uri.toString(),
152+
type: 'eval',
153153
expr: cell.document.getText(),
154154
});
155155
}
156156
}
157+
158+
public async cancel(cell: vscode.NotebookCell): Promise<void> {
159+
if (this.socket && cell.metadata.runState === vscode.NotebookCellRunState.Running) {
160+
this.request({
161+
id: cell.metadata.executionOrder,
162+
uri: cell.uri.toString(),
163+
type: 'cancel',
164+
})
165+
}
166+
}
157167
}
158168

159169
class RNotebook implements vscode.Disposable {
@@ -369,9 +379,8 @@ export class RNotebookProvider implements vscode.NotebookContentProvider, vscode
369379
return;
370380
}
371381

372-
if (notebook) {
382+
if (notebook && cell.metadata.runState !== vscode.NotebookCellRunState.Running) {
373383
try {
374-
cell.metadata.runnable = false;
375384
cell.metadata.runState = vscode.NotebookCellRunState.Running;
376385
const start = +new Date();
377386
cell.metadata.runStartTime = start;

0 commit comments

Comments
 (0)