@@ -73,19 +73,32 @@ make_c_bridge <- function(fsub, strict = TRUE, headers = TRUE) {
7373 }
7474 append(c_body ) <- glue(" return {return_var_names};" )
7575 } else {
76- return_var_names_un <- unname(return_var_names )
76+ return_var_values <- unname(return_var_names )
77+ provided_names <- names(return_var_names )
78+ if (is.null(provided_names )) provided_names <- rep(" " , length(return_var_values ))
79+ has_any_names <- any(nzchar(provided_names ))
80+
7781 append(c_body ) <- c(
78- glue(" SEXP _ans = PROTECT(Rf_allocVector(VECSXP, {length(return_var_names_un )}));" ),
79- imap(return_var_names_un , function (nm , i ) {
82+ glue(" SEXP _ans = PROTECT(Rf_allocVector(VECSXP, {length(return_var_values )}));" ),
83+ imap(return_var_values , function (nm , i ) {
8084 glue(" SET_VECTOR_ELT(_ans, {i-1}, {nm});" )
81- }),
82- glue(" SEXP _names = PROTECT(Rf_allocVector(STRSXP, {length(return_var_names_un)}));" ),
83- imap(return_var_names_un , function (nm , i ) {
84- glue(" SET_STRING_ELT(_names, {i-1}, Rf_mkChar(\" {nm}\" ));" )
85- }),
86- " Rf_setAttrib(_ans, R_NamesSymbol, _names);"
85+ })
8786 )
88- append(c_body ) <- glue(" UNPROTECT({n_protected + 2});" )
87+
88+ if (has_any_names ) {
89+ names_to_use <- provided_names
90+ append(c_body ) <- c(
91+ glue(" SEXP _names = PROTECT(Rf_allocVector(STRSXP, {length(return_var_values)}));" ),
92+ imap(names_to_use , function (nm , i ) {
93+ glue(' SET_STRING_ELT(_names, {i-1}, Rf_mkChar("{nm}"));' )
94+ }),
95+ " Rf_setAttrib(_ans, R_NamesSymbol, _names);"
96+ )
97+ append(c_body ) <- glue(" UNPROTECT({n_protected + 2});" )
98+ } else {
99+ append(c_body ) <- glue(" UNPROTECT({n_protected + 1});" )
100+ }
101+
89102 append(c_body ) <- " return _ans;"
90103 }
91104
@@ -439,14 +452,21 @@ as_friendly_size_expression <- function(d) {
439452closure_return_var_names <- function (closure ) {
440453 return_var_expr <- last(body(closure ))
441454 if (is.symbol(return_var_expr )) {
442- return (as.character(return_var_expr ))
455+ val <- as.character(return_var_expr )
456+ # Return named to keep interface consistent
457+ return (setNames(val , val ))
443458 }
444459 if (is_call(return_var_expr , quote(list ))) {
445460 args <- as.list(return_var_expr )[- 1L ]
446- return (map_chr(args , as.character ))
461+ vals <- map_chr(args , as.character )
462+ nms <- names(args )
463+ if (is.null(nms )) nms <- rep(" " , length(vals ))
464+ # Use provided names when present; fallback to symbol names
465+ # nms <- ifelse(nzchar(nms), nms, vals)
466+ return (setNames(vals , nms ))
447467 }
448- # # is it redundent ? new_fortran_subroutine also errors ?
449- stop(" return value must be a symbol or list of symbols" )
468+ # # is it redundent ? new_fortran_subroutine also errors ?
469+ stop(" return value must be a symbol or list of symbols" )
450470}
451471
452472
0 commit comments