# Current problematic code in R 3.5.3 reformulateProb <- function (termlabels, response=NULL, intercept = TRUE) { if(!is.character(termlabels) || !length(termlabels)) stop("'termlabels' must be a character vector of length at least one") has.resp <- !is.null(response) termtext <- paste(if(has.resp) "response", "~", paste(termlabels, collapse = "+"), collapse = "") if(!intercept) termtext <- paste(termtext, "- 1") rval <- eval(parse(text = termtext, keep.source = FALSE)[[1L]]) if(has.resp) rval[[2L]] <- if(is.character(response)) as.symbol(response) else response ## response can be a symbol or call as Surv(ftime, case) environment(rval) <- parent.frame() rval } # My simple solution reformulateMySol <- function (termlabels, response=NULL, intercept = TRUE) { if(!is.character(termlabels) || !length(termlabels)) stop("'termlabels' must be a character vector of length at least one") has.resp <- !is.null(response) termtext <- paste(if(has.resp) "response", if(has.resp) "~", paste(paste0("`", termlabels, "`"), collapse = "+"), collapse = "") if(!intercept) termtext <- paste(termtext, "- 1") rval <- eval(parse(text = termtext, keep.source = FALSE)[[1L]]) if(has.resp) rval[[2L]] <- if(is.character(response)) as.symbol(response) else response ## response can be a symbol or call as Surv(ftime, case) environment(rval) <- parent.frame() rval } # Current development with str2lang, which I don't have and didn't/couldn't test reformulateRDevel <- function (termlabels, response=NULL, intercept = TRUE, env = parent.frame()) { ## an extension of formula.character() if(!is.character(termlabels) || !length(termlabels)) stop("'termlabels' must be a character vector of length at least one") termtext <- paste(termlabels, collapse = "+") if(!intercept) termtext <- paste(termtext, "- 1") terms <- str2lang(termtext) fexpr <- if(is.null(response)) call("~", terms) else call("~", ## response can be a symbol or call as Surv(ftime, case) if(is.character(response)) tryCatch(str2lang(response), error = function(e) { sc <- sys.calls() sc1 <- lapply(sc, `[[`, 1L) isF <- function(cl) is.symbol(cl) && cl == quote(reformulate) reformCall <- sc[[match(TRUE, vapply(sc1, isF, NA))]] warning(warningCondition(message = paste(sprintf( "Unparseable 'response' \"%s\"; use is deprecated. Use as.name(.) or `..`!", response), conditionMessage(e), sep="\n"), class = c("reformulate", "deprecatedWarning"), call = reformCall)) # , domain=NA as.symbol(response) }) else response, terms) formula(fexpr, env) } # Test control reformulateProb(termlabels = c("Var1", "Var2"), response = "Resp") # Test problem reformulateProb(termlabels = c("Va r1", "Var2"), response = "Resp") # Test control reformulateMySol(termlabels = c("Var1", "Var2"), response = "Resp") # Test problem reformulateMySol(termlabels = c("Va r1", "Var2"), response = "Resp") # Test control reformulateRDevel(termlabels = c("Var1", "Var2"), response = "Resp") # Test problem reformulateRDevel(termlabels = c("Va r1", "Var2"), response = "Resp")