[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