La función NSE de rmarkdown no funciona solo dentro de la llamada a callr.
Parece que tengo una combinación extraña de NSE, rmarkdown y callr, similar en sabor a https://stackoverflow.com/questions/59341040/es-posible-deshabilitar-callr-para-rmarkdown.
Cuando establezco un valor en una variable para usarlo en algo similar a una llamada de filtro implementada usando NSE a través de eval y llamadas de lista anidadas, falla horriblemente, pero solo en callr.
“`{r run_enrichments}
set.seed(1234)
create_go_annotation = function(db, ontology = NULL){
all_genes = keys(db)
go_all_gene = AnnotationDbi::select(db, keys = all_genes, columns = c("GOALL", "ONTOLOGYALL"))
if (!is.null(ontology)) {
go_all_gene = go_all_gene[go_all_gene$ONTOLOGYALL == ontology, ]
ontology_type = paste0("GO.", ontology)
} else {
ontology_type = "GO.all"
}
go_2_gene = split(go_all_gene$ENTREZID, go_all_gene$GOALL)
go_2_gene = lapply(go_2_gene, unique)
go_desc = AnnotationDbi::select(GO.db::GO.db, keys = names(go_2_gene), columns = "TERM", keytype = "GOID")$TERM
names(go_desc) = names(go_2_gene)
go_annotation = categoryCompare2::annotation(annotation_features = go_2_gene,
description = go_desc,
annotation_type = ontology_type,
feature_type = "ENTREZID")
go_annotation
}
library(org.Hs.eg.db)
library(GO.db)
library(categoryCompare2)
library(methods)
go_mf = create_go_annotation(org.Hs.eg.db, "MF")
all_features = unique(unlist(go_mf@annotation_features))
sig_features = sample(all_features, 500)
enrich = hypergeometric_feature_enrichment(
new("hypergeom_features", significant = sig_features,
universe = all_features,
annotation = go_mf),
p_adjust = "BH"
)
comb_enrich = combine_enrichments(sig1 = enrich)
sig_cutoff = 0.1
filter_enrich = get_significant_annotations(comb_enrich, padjust <= sig_cutoff)
“`
Ejecute así a través de callr:
r(function () rmarkdown::render(here::here(“categoryCompare2_failure.Rmd”), salida_file = “cc2_fails_1.md”), mostrar = VERDADERO)
Quitting from lines 13-57 (categoryCompare2_failure.Rmd)
Error in FUN(X[[i]], …) : object ‘sig_cutoff’ not found
Error: callr subprocess failed: object ‘sig_cutoff’ not found
> .Last.error.trace
Stack trace:
Proceso 221313:
1. callr:::r(function () rmarkdown::render(here :: here …
2. callr:::get_result(output = out, options)
3. throw(newerr, parent = remerr[[2]])
x llamada a subprocess de callr fallida: no se encontró el objeto ‘sig_cutoff’
Proceso 221619:
15. (función () …
16. rmarkdown::render(here::here(“categoryCompare2_failure.Rmd”))
17. tejedor::encaje(nudo_entrada, tejido_salida, envir = envir, tranquilo …
18. tejedor:::process_file(text, output)
19. base:::withCallingHandlers(if (tangle) process_tangle(gro …
20. tejedor:::process_group(group)
21. tejedor:::process_group.block(group)
22. tejedor:::call_block(x)
23. tejedor:::block_exec(params)
24. tejedor:::eng_r(options)
25. tejedor:::in_dir(input_dir(), evaluate(code, envir = env, n …
26. tejedor:::evaluar(código, envir = env, new_device = FALSO, k …
27. evaluar::evaluar( … )
28. evaluar:::evaluate_call(expr, parsed$src[[i]], envir = e …
29. evaluar:::timing_fn(handle(ev < – con withCallingHandlers (wit …
30. base:::handle(ev < – con withCallingHandlers (conVisible (eval ( …
31. base:::withCallingHandlers(withVisible(eval(expr, envir, …
32. base:::withVisible(eval(expr, envir, enclos))
33. base:::eval(expr, envir, enclos)
34. base:::eval(expr, envir, enclos)
35. categoryCompare2:::get_significant_annotations(comb_enric …
36. categoryCompare2:::get_significant_annotations(comb_enric …
37. categoryCompare2:::.get_significant_combined_enrichment(i …
38. base:::lapply(in_results@enriched, function(x) { …
39. categoryCompare2:::FUN(X[[i]], …)
40. categoryCompare2:::get_significant_annotations(x@statisti …
41. categoryCompare2:::get_significant_annotations(x@statisti …
42. categoryCompare2:::.get_significant_stat_results(in_resul …
43. categoryCompare2:::multi_query_list(in_results@statistic_ …
44. base:::lapply(queries, eval, list_to_query)
45. base:::FUN(X[[i]], …)
46. base:::FUN(X[[i]], …)
47. base:::.handleSimpleError(function (e) …
48. h(simpleError(msg, call))
x object ‘sig_cutoff’ not found
Se puede ver que se queja de que sig_cutoff no se encuentra, pero existe en el entorno, pero no parece pasarse hacia abajo.
Si en cambio lo ejecuto directamente, funciona:
rmarkdown::render(here::here(“categoryCompare2_failure.Rmd”), salida_file = “cc2_works.md”)
He puesto todo el código en un repositorio de GitHub.
Curiosamente, definitivamente es un problema de callr, porque los objetivos tienen el mismo problema.
callr v 1.0.7, rmarkdown v 2.11, R 4.1.0
Las versiones de otros paquetes se encuentran en el archivo renv.lock.
davy.ai
Basándonos en el código y el mensaje de error proporcionados, parece que el problema está relacionado con el alcance de la variable
sig_cutoff
. En callr, se crea un nuevo entorno, y parece que este entorno no tiene acceso a las variables definidas en el entorno principal. Por lo tanto, cuando se llama a la funciónget_significant_annotations
, la variablesig_cutoff
no se encuentra.Una posible solución sería pasar explícitamente el valor de
sig_cutoff
a la llamada a la función en el archivo Rmd. Por ejemplo:“`{r run_enrichments}
…
define sig_cutoff
sig_cutoff = 0,1
pass sig_cutoff to get_significant_annotations
filter_enrich = get_significant_annotations(
comb_enrich,
padjust <= sig_cutoff,
sig_cutoff = sig_cutoff # pasar el valor aquí
)
Alternativamente, puede utilizar la función
callr::r_bg()
para ejecutar el archivo Rmd en segundo plano, manteniendo el entorno principal accesible:{r}
callr::r_bg(function() rmarkdown::render(
here::here("categoryCompare2_failure.Rmd"),
output_file = "cc2_fails_1.md"
))
Esto debería evitar el problema de alcance y permitir que el archivo Rmd se renderice correctamente.