From 0ad260d81bb2d51c34989daa19fd00c9478ab939 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Fri, 7 Jul 2023 19:26:13 -0500 Subject: Added save environment methods. --- dialoguer/__init__.py | 19 +++++-- dialoguer/dialoguer.r | 146 +++++++++++++++++++++++++++----------------------- 2 files changed, 94 insertions(+), 71 deletions(-) (limited to 'dialoguer') diff --git a/dialoguer/__init__.py b/dialoguer/__init__.py index 21c51d2..93773fd 100644 --- a/dialoguer/__init__.py +++ b/dialoguer/__init__.py @@ -34,7 +34,7 @@ class Dialogue: self.open() def execute_context_script(self): - context_file = __file__.replace('__init__.py', 'context_script.r') + context_file = __file__.replace('__init__.py', 'dialoguer.r') subprocess.run( f'Rscript {context_file} {self.uuid} {self.file_path}', @@ -100,7 +100,7 @@ class Dialogue: return val def assign_variable(self, var_name, var_val): - self.send(3) + self.send(2) recv_chk = self.recv(set_data_type=bool) self.send(var_name, False) recv_chk = self.recv(set_data_type=bool) @@ -108,7 +108,7 @@ class Dialogue: recv_chk = self.recv(set_data_type=bool) def evaluate_expression(self, method_name, *args, **kwargs): - self.send(2) + self.send(3) recv_chk = self.recv(set_data_type=bool) #send number of arguments self.send(len(args)) @@ -132,6 +132,19 @@ class Dialogue: result = self.recv(True) return result + def save_environment(self, file_name = None): + self.send(4) + recv_chk = self.recv(set_data_type=bool) + + if file_name == None: + save_name = self.file_path.replace('.r', '.RData') + elif bool(os.path.dirname(file_name)): + save_name = file_name + else: + save_name = os.path.join(os.getcwd(), file_name) + + self.send(save_name, False) + recv_chk = self.recv(set_data_type=bool) def close(self): self.send(0) diff --git a/dialoguer/dialoguer.r b/dialoguer/dialoguer.r index 32a0149..dbfa8e0 100644 --- a/dialoguer/dialoguer.r +++ b/dialoguer/dialoguer.r @@ -1,12 +1,10 @@ -HEADER <- 2048 -PORT <- 6011 -SERVER <- "localhost" -FORMAT <- "utf-8" -DISCONNECT_MESSAGE <- "!DISSCONNECT" -UUID <- commandArgs(trailingOnly = TRUE)[1] -TARGET_FILE <- commandArgs(trailingOnly = TRUE)[2] - -data_type_vect <- c( +dialoguer.HEADER <- 2048 +dialoguer.PORT <- 6011 +dialoguer.SERVER <- "localhost" +dialoguer.UUID <- commandArgs(trailingOnly = TRUE)[1] +dialoguer.TARGET_FILE <- commandArgs(trailingOnly = TRUE)[2] + +dialoguer.data_type_vect <- c( character = "character", str = "character", integer = "integer", @@ -17,7 +15,7 @@ data_type_vect <- c( bool = "logical" ) -display_msg <- function(...) { +dialoguer.display_msg <- function(...) { cat("\033[94m") cat( ..., @@ -26,33 +24,33 @@ display_msg <- function(...) { } # may not need to pass connection if it will only be 1 per dialogue -send <- function(conn, data, send_data_type = FALSE) { +dialoguer.send <- function(conn, data, send_data_type = FALSE) { if (send_data_type) { data_type_name <- typeof(data) writeBin(data_type_name, conn) - recv_chk <- recv(conn, set_data_type = 'logical') + recv_chk <- dialoguer.recv(conn, set_data_type = 'logical') } writeBin(data, conn) } # may not need to pass connection if it will only be 1 per dialogue # I still want to consolidate the recv_data_type and set_data_type args -recv <- function(conn, recv_data_type = FALSE, set_data_type = "character") { +dialoguer.recv <- function(conn, recv_data_type = FALSE, set_data_type = "character") { if (recv_data_type) { - suppressWarnings(data_type <- readBin(conn, "raw", HEADER)) + suppressWarnings(data_type <- readBin(conn, "raw", dialoguer.HEADER)) while (length(data_type) == 0) { - suppressWarnings(data_type <- readBin(conn, "raw", HEADER)) + suppressWarnings(data_type <- readBin(conn, "raw", dialoguer.HEADER)) } data_type <- readBin(data_type, "character") - data_type <- data_type_vect[data_type] - send(con, TRUE) + data_type <- dialoguer.data_type_vect[data_type] + dialoguer.send(conn, TRUE) } else { data_type <- set_data_type } - suppressWarnings(data <- readBin(conn, "raw", HEADER)) + suppressWarnings(data <- readBin(conn, "raw", dialoguer.HEADER)) while (length(data) == 0) { - suppressWarnings(data <- readBin(conn, "raw", HEADER)) + suppressWarnings(data <- readBin(conn, "raw", dialoguer.HEADER)) } data <- readBin(data, data_type) @@ -60,52 +58,52 @@ recv <- function(conn, recv_data_type = FALSE, set_data_type = "character") { return(data) } -find_connection <- function() { +dialoguer.find_connection <- function() { connected <- FALSE while (!connected) { - con <- socketConnection( - host = SERVER, - port = PORT, + conn <- socketConnection( + host = dialoguer.SERVER, + port = dialoguer.PORT, server = FALSE, open = "a+b" ) - send(con, UUID) - uuid_chk <- recv(con) - connected <- (UUID == uuid_chk) + dialoguer.send(conn, dialoguer.UUID) + uuid_chk <- dialoguer.recv(conn) + connected <- (dialoguer.UUID == uuid_chk) if (!connected) { - close(con) + close(conn) } } - return(con) + return(conn) } -import_variable <- function() { - var_name <- recv(con, FALSE, "character") +dialoguer.import_variable <- function() { + var_name <- dialoguer.recv(dialoguer.con, FALSE, "character") var_val <- get(var_name) - send(con, var_val, TRUE) + dialoguer.send(dialoguer.con, var_val, TRUE) } -assign_variable <- function() { - var_name <- recv(con, FALSE, "character") - send(con, TRUE) - var_val <- recv(con, TRUE) - send(con, TRUE) +dialoguer.assign_variable <- function() { + var_name <- dialoguer.recv(dialoguer.con, FALSE, "character") + dialoguer.send(dialoguer.con, TRUE) + var_val <- dialoguer.recv(dialoguer.con, TRUE) + dialoguer.send(dialoguer.con, TRUE) assign(var_name, var_val, envir = globalenv()) } -evaluate_expression <- function() { - arg_count <- recv(con, FALSE, "integer") - send(con, TRUE) - kwarg_count <- recv(con, FALSE, "integer") - send(con, TRUE) - method_name <- recv(con, FALSE, "character") - send(con, TRUE) +dialoguer.evaluate_expression <- function() { + arg_count <- dialoguer.recv(dialoguer.con, FALSE, "integer") + dialoguer.send(dialoguer.con, TRUE) + kwarg_count <- dialoguer.recv(dialoguer.con, FALSE, "integer") + dialoguer.send(dialoguer.con, TRUE) + method_name <- dialoguer.recv(dialoguer.con, FALSE, "character") + dialoguer.send(dialoguer.con, TRUE) args <- list() if (arg_count > 0) { for (i in 1:arg_count) { - args <- c(args, recv(con, TRUE)) - send(con, TRUE) + args <- c(args, dialoguer.recv(dialoguer.con, TRUE)) + dialoguer.send(dialoguer.con, TRUE) } } kwargs <- list() @@ -113,38 +111,50 @@ evaluate_expression <- function() { keys <- c() vals <- list() for (i in 1:kwarg_count) { - keys <- c(keys, recv(con)) - send(con, TRUE) - vals <- c(vals, recv(con, TRUE)) - send(con, TRUE) + keys <- c(keys, dialoguer.recv(dialoguer.con)) + dialoguer.send(dialoguer.con, TRUE) + vals <- c(vals, dialoguer.recv(dialoguer.con, TRUE)) + dialoguer.send(dialoguer.con, TRUE) } kwargs <- setNames(vals, keys) } args <- c(args, kwargs) result <- do.call(method_name, args) - send(con, result, TRUE) + dialoguer.send(dialoguer.con, result, TRUE) +} + +dialoguer.save_environment <- function() { + file_name <- dialoguer.recv(dialoguer.con, FALSE, "character") + dialoguer.send(dialoguer.con, TRUE) + all_vars <- ls(envir = globalenv()) + exclude_vars <- all_vars[grep("dialoguer\\.", all_vars)] + vars_to_save <- setdiff(all_vars, exclude_vars) + save(list = vars_to_save, file = file_name, envir = globalenv()) } -con <- find_connection() +dialoguer.con <- dialoguer.find_connection() #load target file -source(TARGET_FILE) - -send(con, TRUE) - -cmd_int <- -1 -while (cmd_int != 0) { - cmd_int <- recv(con, FALSE, "integer") - if (cmd_int == 1){ - send(con, TRUE) - import_variable() - } else if (cmd_int == 2) { - send(con, TRUE) - evaluate_expression() - } else if (cmd_int == 3) { - send(con, TRUE) - assign_variable() +source(dialoguer.TARGET_FILE) + +dialoguer.send(dialoguer.con, TRUE) + +dialoguer.cmd_int <- -1 +while (dialoguer.cmd_int != 0) { + dialoguer.cmd_int <- dialoguer.recv(dialoguer.con, FALSE, "integer") + if (dialoguer.cmd_int == 1){ + dialoguer.send(dialoguer.con, TRUE) + dialoguer.import_variable() + } else if (dialoguer.cmd_int == 2) { + dialoguer.send(dialoguer.con, TRUE) + dialoguer.assign_variable() + } else if (dialoguer.cmd_int == 3) { + dialoguer.send(dialoguer.con, TRUE) + dialoguer.evaluate_expression() + } else if (dialoguer.cmd_int == 4) { + dialoguer.send(dialoguer.con, TRUE) + dialoguer.save_environment() } } -close(con) \ No newline at end of file +close(dialoguer.con) \ No newline at end of file -- cgit v1.2.3