Можно ли передать имена методов в качестве аргумента функции-оболочки в R? - PullRequest
2 голосов
/ 09 октября 2019

Я работаю над сценарием R, основанным на библиотеке RSelenium, который нацелен на использование «сценариев очистки» в виде таблицы. Поэтому я хотел бы использовать функцию, которая в соответствии с определенными аргументами возвращает определенное действие удаленного драйвера. Общая идея состоит в том, чтобы иметь что-то, что преобразует аргументы в синтаксис методов:

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

Так что, если я позвоню:

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", "[@=...]")

Вот пример, который я закончил:

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))

}

Соглашение в двойных скобках в scraperMethods [[method]], похоже, работает в глобальной среде, но когда я вызываю

scraper(remDr, "open")

или другие методы, определенные до сих пор в функции скребка. Выдает ошибку:

Ошибка: оператор $ недопустим для атомных векторов

Итак, мои вопросы: 1. Это правильный подход? 2. Если нет - есть ли более удобный способ достижения моей цели?

Заранее спасибо за все ответы.

...