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.

¿Cómo establezco métodos dentro de un paquete para determinar el tamaño de un gTree construido con grid?

He escrito una función para construir un gráfico utilizando grobs de cuadrícula y un método para obtener el ancho del gTree resultante. La función de método se reconoce cuando se ejecuta desde un script pero no cuando intento cargarla como parte de un paquete.

En mi archivo de código de paquete tengo:

require(grid)
require(reshape)

widthDetails.bHMLegend <- function(x){
  minX0 <- min(do.call(unit.c, lapply(x$children, grobX, theta = 180)))
  maxX1 <- max(do.call(unit.c, lapply(x$children, grobX, theta = 0)))
  return(grobWidth(segmentsGrob(x0 = minX0, x1 = maxX1)))}

bHMLegend <- function(sizeBreaks, title){
    gTree(name="BHMLegend", cl="bHMLegend", children = gList(
      rectGrob(x = 0.5, y = c(0.5:(length(sizeBreaks)-0.5))unit(0.5, "cm"), 
      height = unit(0.5, "cm"), width = unit(0.5, "cm"), just=c("left", "centre")),
      textGrob(sizeBreaks, x = unit(0.5, "npc") + unit(0.5, "cm") + unit(1, "char"), 
      y = seq(0.5, length(sizeBreaks)-0.5, 1)unit(0.5, "cm"), just=c("left", "centre")),
      textGrob(title, x = unit(0.5, "npc") + unit(0.25, "cm"), 
      y = unit(0.5, "cm")*(length(sizeBreaks)+0.5), just=c("centre", "bottom"))))
}

En mi archivo de script de prueba tengo:

require(devtools)
load_all()
tree <- bHMLegend(c(0, 10, 20, 30, 40, 50, 60, 70, 80), title="Legend Title")

convertUnit(grobWidth(tree), "cm")

widthDetails.bHMLegend <- function(x){
  minX0 <- min(do.call(unit.c, lapply(x$children, grobX, theta = 180)))
  maxX1 <- max(do.call(unit.c, lapply(x$children, grobX, theta = 0)))
  return(grobWidth(segmentsGrob(x0 = minX0, x1 = maxX1)))}

convertUnit(grobWidth(tree), "cm")

La primera llamada a convertUnit() devuelve 0cm, pero la segunda vez después de cargar la función directamente en el entorno global obtengo la respuesta esperada (~2,42cm). ¿Cómo puedo hacer que esto funcione desde el paquete?

Gracias (editado para incluir código de ejemplo completo)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el ámbito de la función widthDetails.bHMLegend. Cuando se ejecuta el código desde el script, la función se carga en el entorno global, y se reconoce cuando se llama a convertUnit(). Sin embargo, cuando se ejecuta el código desde el paquete, la función no se carga en el entorno global y no se reconoce cuando se llama a convertUnit().

    Para obtener la respuesta esperada al ejecutar el código desde el paquete, es necesario asegurarse de que la función widthDetails.bHMLegend se carga en el entorno global. Esto se puede hacer añadiendo la siguiente línea de código al archivo de código del paquete:

    assign("widthDetails.bHMLegend", widthDetails.bHMLegend, envir = .GlobalEnv)
    

Comments are closed.