\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[spanish]{babel}
\usepackage{graphicx}
\usepackage{float}
\usepackage{capt-of}
\newcommand{\pdfgraphics}{\DeclareGraphicsExtensions{.png,.pdf,.jpg}}
\setlength{\topmargin}{-0.2in}
\setlength{\textheight}{9in}
\setlength{\textwidth}{6.0in}
\setlength{\oddsidemargin}{0.0in}

\begin{document}
\title{MODIFICAR EL MENÚ DE Rcmdr}
\author{}
\date{Mayo del 2007}

\maketitle

\begin{abstract}
Este documento pretende explicar de forma clara y sencilla, cómo podemos modificar el menú de Rcmdr, ya sea ampliándolo con items nuevos o incluyendo un item en un menú ya existente. Además veremos cómo se añade una función implementada por el usuario en nuestro nuevo menú.
\end{abstract}

\begin{flushleft}

\section{Estructura del  menú Rcmdr}\bigskip

La configuración del menú de Rcmdr viene detallada en un archivo de texto plano, llamado Rcmdr-menus, que se encuentra en el directorio de instalación, en nuestro caso: \textbf{C:$\backslash$ Archivos de programa$\backslash$R$\backslash$R-2.4.1$\backslash$library$\backslash$Rcmdr$\backslash$etc}. \bigskip

Como bien sabemos, cuando utilizamos cualquier aplicación, cada menú puede ser un menú principal, submenú o un item. Por ejemplo el menú \textit{Archivo} es un menú principal, \textit{archivos recientes} es un submenú y \textit{cerrar} es es un item del menú principal. Esta estructura se repite en las sucesivas ramas del menú.\bigskip

Además cada entrada de menú, puede llamar a un procedimiento o puede contener otro menú. En el caso de que la entrada del menú ejecute una orden puede ocurrir que ésta esté activa siempre, o que sólo lo esté cuando existan los argumentos necesarios para ejecutarse. Veamos un ejemplito:\bigskip

En el menú \textit{Edición} existe la opción \textit{pegar}, que sólo estará activa si hay un objeto previamente copiado. Sin embargo, la opción \textit{salir} está siempre activa. Normalmente un menú desactivado aparece escrito con letra gris y en negro si está activo.\bigskip

Pero eso no es todo, si un menú ejecuta un procedimiento, puede ser que necesite cargar un paquete determinado que no se carge al inicio de Rcmdr, con lo que debemos especificar el paquete a cargar.\bigskip

Bueno, pues todo lo necesario para definir correctamente un menú está explicado, ahora queda la pregunta que se está haciendo ¿Cómo lo hago?\bigskip.

Primero un pasito más:\bigskip

Si abrimos el archivo \textit{Rcmdr-menus}, nos encontramos una serie de columnas con sus correspondientes etiquetas, ¿Para que sirven cada una?
\newpage

%IMAGEN ESTRUCTURA DE RCMDR-MENUS

\begin{figure}[h]
        \centering
        \includegraphics[width=0.9\textwidth]{Rcmdr3.pdf}
\end{figure}

\begin{enumerate}
\item \textbf{Type}\bigskip

En esta columna se especifica el tipo de entrada que vamos a añadir, que pueden ser:\bigskip

\begin{itemize}

\item \textit{menu}\bigskip

Se utiliza siempre que vayamos a insertar un menú principal, o en el el caso de ser un submenú.\bigskip

Observemos que no se diferencia entre menú pricipal y submenú, ambos son denotados por la palabra \textit{menu} pero no es igual su construcción en las columnas, más adelante veremos su dieferencia.


\item \textit{item}\bigskip

Si queremos que la entrada ejecute una aplicación directamente.
\end{itemize}

\item \textbf{Menu$\backslash$Item}\bigskip

En esta columna tenemos tres opciones de entrada:\bigskip

\begin{itemize}

\item Comenzamos un menú o submenú, en cuyo caso escribiremos en la columna un nombre interno que distinga cada menú (no para etiquetarlo en el programa). Normalmente son nombres del tipo: \textit{filemenu, datamenu, esteesmimenumenu...}\bigskip
\item Introducimos un nuevo item al menú. En esta columna se pondrá entonces el nombre del menú o submenú al que pertenece el item, (el inmediatemente superior).
\newpage

Ejemplito:\bigskip

En el menú \textit{Archivo} existe el submenú \textit{archivos recientes} y dentro de éste hay una serie de items que son los últimos 4 ó 5 archivos que hemos abierto con esa aplicación, pues bien, se considera que cada item pertenece al menú \textit{archivos recientes} y se pondría el nombre de ese menú. NO DEL MENÚ ARCHIVO, aunque esos item pertenecen a su vez al menú \textit{Archivo}.
\item La última opción es cerrar un menú o submenú. Para ello se escribe el nombre interno del menú anterior al nuestro. Ejemplito: \bigskip

En el caso anterior escribiríamos el nombre interno del menú \textit{Archivo} para cerrar el menú \textit{archivos recientes}.\bigskip

\end{itemize}

\item \textbf{operation/parent}

De nuevo tenemos tres posibilidades para esta columna:\bigskip

\begin{itemize}
\item Cuando iniciamos un menú o submenú indicaremos su emplazamiento. Si es un submenú pondremos el nombre interno del menú que lo contiene, y si es un menú principal se pondrá la orden \textit{topmenu}.

\item Si es un item del menú que ejecuta una orden pondremos la instrucción \textit{command}.

\item En el caso de cerrar un menú o submenú se pondrá la orden \textit{cascade}.
\end{itemize}

\item \textbf{label}

\begin{itemize}
\item Cuando iniciamos un menú o submenú se pondrán comillas vacías,  `` ''.

\item Si es un item del menú pondremos la etiqueta que queremos que aparezca en el programa y siempre debe ir entre comillas, ``nombre del item''

\item En el caso de cerrar un menú o submenú se pondrá en esta columna la etiqueta del menú o submenú. Siempre debe ir entre comillas, ``nombre del menú''.
\end{itemize}

\item \textbf{command$\backslash$menu}

\begin{itemize}
\item Cuando iniciamos un menú o submenú se pondrán comillas vacías,  `` ''.

\item Si es un item del menú que ejecuta una orden pondremos la instrucción que queremos llamar. El conjunto de órdenes que podemos llamar está en el archivo de texto plano Rcmdr que se encuentra en \textbf{C:$\backslash$ Archivos de programa$\backslash$R$\backslash$R-2.4.1$\backslash$library\newline $\backslash$Rcmdr$\backslash$R}.

\item En el caso de cerrar un menú o submenú se pondrá el nombre interno del menú que vamos a cerrar.
\end{itemize}

\item \textbf{activation}

En esta columna se determina si el menú o item del menú estará activo o no. Si escribimos comillas vacias se entiende que esa entrada estará siempre activa. Si queremos que esté activa bajo ciertas condiciones debemos escribir entre comillas la$\backslash$s orden$\backslash$es convenientes que vienen recogida en \textbf{C:$\backslash$Archivos de programa$\backslash$R$\backslash$R-2.4.1$\backslash$library$\backslash$Rcmdr$\backslash$html\newline $\backslash$Rcmdr.Utilities.html}

\item \textbf{install?}

En esta columna se especifica si se ha de cargar un paquete concreto para que funcione la aplicación a la que llama el item. Para ello usamos la orden \textit{``packageAvailable('nombre del paquete')''}. En el caso de ser un menú este campo se rellena con comillas vacías.

\end{enumerate}

\section{Construyamos un nuevo menú}

Antes de empezar a modificar los campos del fichero Rcmdr-menus, es conveniente tener una idea clara de la estructura del nuevo menú. Nada mejor que un ejemplo para ver las cosas claras:\bigskip

Supongamos que queremos insertar un nuevo menú en Rcmdr con la siguiente estructura:\bigskip


% INSERTAR IMAGEN MENÚ

\begin{figure}[h]
        \centering
        \includegraphics[width=0.4\textwidth]{Rcmdr10.pdf}
\end{figure}


El primer paso es ubicarlo dentro del menú de Rcmdr, el orden de escritura en el archivo Rcmdr-menus se corresponde con el orden del menú de izquierda a derecha del programa. Supongamos que queremos emplazarlo a la derecha del menú \textit{Archivo} entonces debemos modificar el fichero justamente debajo de \textit{filemenu}.

Vamos a modificar el archivo Rcmdr-menus para incluir un menú de ejemplo llamado \textit{EjemploMenu}:\bigskip


% INSERTAR IMAGEN DE RCMDR-MENUS MODIFICADO

\begin{figure}[h]
        \centering
        \includegraphics[width=0.9\textwidth]{Rcmdr8.pdf}
\end{figure}

Una vez guardados los cambios del archivo, se arranca R y se carga Rcmdr. El resultado debe ser el siguiente:
\newpage

\begin{figure}[h]
        \centering
        \includegraphics[width=0.9\textwidth]{Rcmdr9.pdf}
\end{figure}

\section{Añadir una función al menú de Rcmdr}

Supongamos que utilizamos habitualmente una función de R o que tenemos una función nueva que hemos programado y queremos añadirla a nuestro menú de Rcmdr. Recordemos que nuestra función debe ser un fichero del tipo \textit{mifuncion.R} en formato ASCII. A modo de ejemplo vamos a insertar una modificación de la función \textit{t.test} que llamaremos \textit{tt.test}.\bigskip


\begin{enumerate}
\item \textbf{Emplazar la función en el menú}\bigskip

Buscamos un lugar adecuado donde insertar nuestra función. En nuestro caso lo haremos en el menú \textit{Estadísticos}, dentro del submenú \textit{Medias}. Aquí aparecerá como un item más de este submenú.

\item \textbf{Antes de modificar el fichero Rcmdr-menus}\bigskip

En nuestro caso la función \textit{tt.test} requiere unos argumentos iniciales, de modo que cuando pulsemos sobre su item, queremos que aparezca una ventana de diálogo que nos solicite los datos de entrada. Para ello debemos construir esta ventana, con sus etiquetas, botones y entradas en un archivo de texto en lenguaje \textit{tcl-tk} y guardarlo con extensión .R. En nuestro ejemplo hemos utilizado \textit{ttestbox.R}.\bigskip

¿Cómo hemos construido la ventana?\bigskip

Siguiendo el consejo de nuestro amigo \textit{J. Fox} hemos localizado una ventana de diálogo que pida algo parecido a lo que buscamos y la hemos modificado para que se ajuste a nuestras necesidades.\bigskip

¿Dónde busco ventanas ya construidas?\bigskip

Entre los items del menú de Rcmdr que abren una ventana de diálogo. Una vez localizado el item que nos interesa, lo buscamos en el archivo \textit{Rcmdr-menus} y, el nombre que aparece en el campo \textit{command$\backslash$menu}
es el nombre de la aplicación que genera la ventana. En contra de lo que se puede suponer, todas estas aplicaciones están recogidas en un sólo archivo llamado \textit{Rcmdr} y localizado en el directorio: \textbf{C:$\backslash$ Archivos de programa$\backslash$R$\backslash$R-2.4.1$\backslash$library$\backslash$\newline Rcmdr$\backslash$R}.\bigskip

\textsl{Observación:}\bigskip

Las funciones que generan una ventana no sólo construyen la ventana, además le dicen a R qué función debe ejecutar cuando el usuario pulsa el botón Ok de la ventana. El paquete Rcmdr imprime en pantalla todas las órdenes que el usuario ejecuta mediante su entorno. De esta forma podemos ver que órdenes estamos utilizando y con qué argumentos. De esto se encarga la orden \textit{doItAndPrint} utilizada en este tipo de funciones.

\item \textbf{Modificar el fichero Rcmdr-menus}\bigskip

Ya estamos listos para insertar la línea del nuevo item del submenú \textit{Medias}. Para ello abrimos el archivo Rcmdr-menus y localizamos el submenú \textit{meansMenu}. Vamos a situarlo justamente debajo del item \textit{Single-sample t-test...}.\bigskip


%INSERTAR IMAGEN DE NUEVA LINEA EN RCMDR-MENUS

\begin{figure}[h]
        \centering
        \includegraphics[width=0.9\textwidth]{Rcmdr4.pdf}
\end{figure}


Observemos que en el campo \textit{command$\backslash$menu} hemos puesto el nombre de la aplicación que inicia mi ventana y como comentamos antes se llama \textsl{ttestbox}.\bigskip

No olvidemos que hay que guardar los cambios en este fichero antes de cargar Rcmdr. Y en el caso de bajar de la red el fichero \textit{Rcmdr-menus} ya modificado, debemos sustituirlo por el original en la carpeta \textsl{etc}.

\item \textbf{Un pequeño gran detalle}

Para que todo esto funcione, tanto nuestra función \textit{tt.test} como la ``ventana'' \textit{ttestbox} deben estar en el directorio \textbf{C:$\backslash$ Archivos de programa$\backslash$R$\backslash$R-2.4.1$\backslash$library$\backslash$Rcmdr$\backslash$etc} que \textit{Rcmdr} carga al principio.\bigskip

Otra forma de que Rcmdr encuentre donde está la función que genera nuestra ventana es añadiéndola al archivo \textit{Rcmdr} que contiene a todas las funciones que generan ventanas en Rcmdr. No podemos hacer lo mismo con nuestra función \textit{ttest}, que ha de seguir estando en el directorio anterior.


\end{enumerate}




\end{flushleft}




\end{document}
