[education/rkward] /: Fix logging message capture to output file

Thomas Friedrichsmeier null at kde.org
Thu May 1 10:10:58 BST 2025


Git commit 01dab2c136321f3981ece948a9fade9f10adfe1f by Thomas Friedrichsmeier.
Committed on 01/05/2025 at 09:10.
Pushed by tfry into branch 'master'.

Fix logging message capture to output file

M  +2    -0    ChangeLog
M  +2    -0    rkward/rbackend/rkrbackend.cpp
M  +11   -7    rkward/rbackend/rkrsupport.cpp
M  +1    -0    rkward/rbackend/rkrsupport.h

https://invent.kde.org/education/rkward/-/commit/01dab2c136321f3981ece948a9fade9f10adfe1f

diff --git a/ChangeLog b/ChangeLog
index 15bd2afb8..e1517ebbb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,6 @@
 --- Version 0.8.2 - UNRELEASED
+- Fixed: Printing of captured R messages/warnings in plugins was broken
+- Internal: Code cleanups
 - Internal: Remove dependency on Qt5-compatibility library
 
 --- Version 0.8.1 - Apr-21-2025
diff --git a/rkward/rbackend/rkrbackend.cpp b/rkward/rbackend/rkrbackend.cpp
index 92814e75c..b99fdbe72 100644
--- a/rkward/rbackend/rkrbackend.cpp
+++ b/rkward/rbackend/rkrbackend.cpp
@@ -1375,6 +1375,8 @@ void doPendingPriorityCommands() {
 void RKRBackend::catToOutputFile(const QString &out) {
 	RK_TRACE(RBACKEND);
 
+	SEXP output_file_r = RFn::Rf_findVar(RFn::Rf_install(".rk.output.html.file"), RKRSupport::getRKVariablesEnv());
+	auto output_file = RKRSupport::SEXPToString(output_file_r);
 	if (output_file.isEmpty()) {
 		RK_ASSERT(false);
 		return;
diff --git a/rkward/rbackend/rkrsupport.cpp b/rkward/rbackend/rkrsupport.cpp
index 8ca31f818..98b774558 100644
--- a/rkward/rbackend/rkrsupport.cpp
+++ b/rkward/rbackend/rkrsupport.cpp
@@ -269,6 +269,16 @@ RData *RKRSupport::SEXPToRData(SEXP from_exp) {
 	return data;
 }
 
+SEXP RKRSupport::getRKVariablesEnv() {
+	SEXP rkn = RFn::Rf_allocVector(STRSXP, 1);
+	RFn::SET_STRING_ELT(rkn, 0, RFn::Rf_mkChar("package:rkward"));
+	SEXP rkwardenv = RKRSupport::callSimpleFun(RFn::Rf_install("as.environment"), rkn, ROb(R_GlobalEnv));
+	RK_ASSERT(RFn::Rf_isEnvironment(rkwardenv));
+	SEXP rkwardvars = RFn::Rf_eval(RFn::Rf_findVar(RFn::Rf_install(".rk.variables"), rkwardenv), ROb(R_BaseEnv)); // NOTE: RFn::Rf_eval to resolve promise
+	RK_ASSERT(RFn::Rf_isEnvironment(rkwardvars));
+	return rkwardvars;
+}
+
 SEXP RKRShadowEnvironment::shadowenvbase = nullptr;
 QHash<SEXP, RKRShadowEnvironment *> RKRShadowEnvironment::environments;
 RKRShadowEnvironment *RKRShadowEnvironment::environmentFor(SEXP baseenvir) {
@@ -277,13 +287,7 @@ RKRShadowEnvironment *RKRShadowEnvironment::environmentFor(SEXP baseenvir) {
 	if (!environments.contains(baseenvir)) {
 		RK_DEBUG(RBACKEND, DL_DEBUG, "creating new shadow environment for %p\n", baseenvir);
 		if (!shadowenvbase) {
-			SEXP rkn = RFn::Rf_allocVector(STRSXP, 1);
-			RFn::SET_STRING_ELT(rkn, 0, RFn::Rf_mkChar("package:rkward"));
-			SEXP rkwardenv = RKRSupport::callSimpleFun(RFn::Rf_install("as.environment"), rkn, ROb(R_GlobalEnv));
-			RK_ASSERT(RFn::Rf_isEnvironment(rkwardenv));
-			SEXP rkwardvars = RFn::Rf_eval(RFn::Rf_findVar(RFn::Rf_install(".rk.variables"), rkwardenv), ROb(R_BaseEnv)); // NOTE: RFn::Rf_eval to resolve promise
-			RK_ASSERT(RFn::Rf_isEnvironment(rkwardvars));
-			shadowenvbase = RFn::Rf_findVar(RFn::Rf_install(".rk.shadow.envs"), rkwardvars);
+			shadowenvbase = RFn::Rf_findVar(RFn::Rf_install(".rk.shadow.envs"), RKRSupport::getRKVariablesEnv());
 			RK_ASSERT(RFn::Rf_isEnvironment(shadowenvbase));
 		}
 
diff --git a/rkward/rbackend/rkrsupport.h b/rkward/rbackend/rkrsupport.h
index 9bfef47b0..fb216025f 100644
--- a/rkward/rbackend/rkrsupport.h
+++ b/rkward/rbackend/rkrsupport.h
@@ -33,6 +33,7 @@ RData::IntStorage SEXPToIntArray(SEXP from_exp);
 int SEXPToInt(SEXP from_exp, int def_value = INT_MIN);
 RData::RealStorage SEXPToRealArray(SEXP from_exp);
 RData *SEXPToRData(SEXP from_exp);
+SEXP getRKVariablesEnv(); /**< retries the rkward:::.rk.variables environment. NOTE: currently not cached */
 
 /** Replacement for BEGIN_SUSPEND_INTERRUPTS-macro that we cannot easily use */
 class InterruptSuspension {


More information about the rkward-tracker mailing list