Parece posible asignar un vector de funciones en R como este:

F <- c(function(){return(0)},function(){return(1)})

para que puedan ser invocados como este (por ejemplo): F[[1]]().

Esto me dio la impresión de que yo podía hacer esto:

DF <- data.frame(F=c(function(){return(0)}))

que los resultados en la siguiente error

De Error en la medida.de datos.marco.predeterminado(x[[i]], opcional = TRUE) : no se puede
coaccionar a clase «, «función» a» de datos.marco

¿Esto significa que no es posible poner funciones en un marco de datos? O estoy haciendo algo mal?

  • Por qué quieres tener la función en data.frame? Este es el objeto que consta de los vectores (números, caracteres), pero no las funciones. Podría usted describir con más precisión lo que quieres lograr?
  • Las funciones son objetos, en un sentido abstracto. Hay muchas posibles razones para querer tratarlos como datos, por lo que muchos lenguajes permiten. En mi caso, el marco de datos que contiene un conjunto de sustitución de macros asociadas con contenido generado dinámicamente. Esto permite un tipo de documento de preprocesador para utilizar el marco de datos para buscar la función a llamar para generar la sustitución adecuada.
InformationsquelleAutor Museful | 2014-03-28

2 Comentarios

  1. 1

    No, No se puede poner directamente una función en una base de datos-marco.

    Sin embargo, puede definir las funciones de antemano y poner sus nombres en el marco de datos.

    foo <- function(bar) { return( 2 + bar ) }
    foo2 <- function(bar) { return( 2 * bar ) }
    df <- data.frame(c('foo', 'foo2'), stringsAsFactors = FALSE)

    A continuación, utilizar do.call() para utilizar las funciones de:

    do.call(df[1, 1], list(4))
    # 6
    
    do.call(df[2, 1], list(4))
    # 8

    EDITAR

    El trabajo por encima de todo funcionará siempre y cuando usted tiene un nombre de función.

    El problema parece ser que R ver la clase del objeto como una función, se busca el método apropiado para as.data.frame() (es decir, as.data.frame.function()) pero no la puede encontrar. Que hace una llamada a as.data.frame.default() que bonito debe de es un contenedor para un stop() llamada con el mensaje que informa.

    En resumen, no parece que no lo han implementado para esa clase.

    • Gracias. Me pregunto por qué no es posible, y si esta solución funcionaría si la función es un cierre.
    • ver mis ediciones.
  2. 1

    Mientras que usted no puede poner una función u otro objeto directamente en una base de datos.marco, usted puede hacer el trabajo si usted va a través de una matriz.

    foo <- function() {print("qux")}
    m <- matrix(c("bar", foo), nrow=1, ncol=2)
    df <- data.frame(m)
    df$X2[[1]]()

    Rendimientos:

    [1] "qux"

    Y el contenido de df aspecto:

      X1                                   X2
    1 bar function () , {,     print("qux"), }

    Muy bien por qué esto funciona mientras el camino directo no, no sé. Sospecho que esto en ningún código de producción sería una «cosa mala».

Dejar respuesta

Please enter your comment!
Please enter your name here