¿Es posible pasar los nombres de métodos como un argumento de función de contenedor en R?

votos
1

Estoy trabajando en un guión basado en la biblioteca R RSelenium que tiene como objetivo utilizar raspado de escenarios en forma de un Tibble. Por lo tanto me gustaría utilizar una función, que de acuerdo con ciertos argumentos cierta devolvería la acción del controlador remoto. La idea general es tener algo que convertirá argumentos a la sintaxis métodos:

scraper(driver, method, arguments) == driver$method(arguments)

Así que si llamo:

scraper(remDr, open) - it simply does - remDr$open()
scraper(remDr, navigate, https://google.com) - it does - remDr$navigate(https://google.com)
scraper(remDr, findElement, list(using = xpath, [@=...]) - it does - remDr$findElement(xpath, [@=...])

Aquí está la muestra que he terminado con:

scraper <- function(driver, method, arguments = ) {

  open <- function(driver) {
    return(
        driver$open()
    )
  }

  close <- function(driver) {
    return(
        driver$close()
      )
  }

  navigate <- function(driver, arguments) {
    return(
        driver$navigate(arguments)
      )
  }

  findElement <- function(driver, arguments) {
    return(
        driver$findElement(arguments)
      )
  }

  scraperMethods <- list(open = open, 
                         close = close, 
                         navigate = navigate, 
                         findElement = findElement)

  return(scraperMethods[[method]](arguments))

}

El convenio de doble paréntesis en scraperMethods [[método]] parece funcionar en el entorno global, pero cuando llamo

scraper(remDr, open)

u otros métodos definidos hasta ahora dentro de la función rascador. Se genera un error:

Error: $ operador no es válida para los vectores atómicas

Así que mis preguntas son: 1. ¿Es este el enfoque correcto? 2. Si no es así - ¿Existe una manera más conveniente para lograr mi objetivo?

Gracias de antemano por todas las respuestas.

Publicado el 09/10/2019 a las 18:52
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more