es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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ón get_significant_annotations, la variable sig_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í
    )


    Luego, modificar el comando callr para incluir los argumentos necesarios: ```{r} r(function() rmarkdown::render( here::here("categoryCompare2_failure.Rmd"), output_file = "cc2_fails_1.md", params = list(sig_cutoff = 0,1) # pasar el valor aquí también ), show = TRUE)

    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.

Comments are closed.