Cosas de R (¿que tal vez alguien sabrá explicar?)

En Twitter, leo

¿Alguien puede explicar lo que ocurre? ¿Es tan grade como parece indicar sorna el autor del tuit?

3 comentarios sobre “Cosas de R (¿que tal vez alguien sabrá explicar?)

  1. Iñaki 9 septiembre, 2015 11:18

    Pasa que «na.r» no es un parámetro válido y lo que está haciendo es meter ese valor que se asigna (TRUE, que viene siendo un 1) en el vector de valores a sumar que se le pasa a la implementación en C. Si hacemos lo mismo con el parámetro válido, «na.rm», no sucede eso. Y si ponemos cualquier otro nombre de parámetro, como sum() acepta cualquier número de parámetros como entrada, el valor pasa al vector de suma. Ejemplo:


    > sum(c(1, 2), na.rm=T)
    [1] 3
    > sum(a=2, b=3)
    [1] 5

    ¿Bug o feature? De cualquier forma, no me parece muy grave.

  2. daniel 9 septiembre, 2015 12:39

    me recuerda el error típico en las instrucciones condicionales if,
    if (a == True) … frente a if (a=True). El problema es utilizar un mismo signo para la asignación y para el paso de parámetros con nombre. Por ejemplo en Lisp este tipo de situaciones no puede producirse ya que las llamadas son del tipo

    busca( :nombre «Pepe» :edad 2000 :if-alive «surprise»)

  3. Iñaki 9 septiembre, 2015 22:01

    @daniel
    Usar el mismo signo para el paso de parámetros es lo de menos. Python y otros lenguajes lo hacen y no hay problema alguno. El tema es que en R se gestiona mal el input para funciones que operan sobre un número indeterminado de parámetros de entrada. Supongo que habrá un pedazo de código centralizado para hacer eso (no me he puesto a buscarlo), pero no creo que sea difícil de solucionar.

    Básicamente les pasa a todas las funciones que están definidas en la ayuda de la siguiente manera:


    Usage:
    function(..., na.rm = FALSE)
    Arguments:
    ...: numeric or complex or logical vectors.

    Como por ejemplo sum(), pero también max(), min(), etc. Para muestra, un botón:


    > max(0.3, 0.4, asdf=T)
    [1] 1

Los comentarios están desabilitados.