R передает среду драйвера RSelenium в качестве аргумента функции

я, вероятно, не вижу чего-то очевидного, в любом случае я хотел бы создать функции для автоматического извлечения текста из URL-адреса, уже обработанного удаленным драйвером. Я хотел бы передать в качестве аргументов функции выражение xpath и среду, в которой можно найти удаленный драйвер.

library(RSelenium)

url="http://stackoverflow.com/search?q=r+program"
remdir<-remoteDriver(remoteServerAddr = "localhost", port = 4444, browserName = "firefox")
remdir$open()
remdir$navigate(url)
env<-environment()

#env should be the environment in wich remdir exist (remdir itself?)
#xp the xpath expression to evaluate in the form "//*"
fun.XpathExtractText<-function(xp,env)
{
  cat("\ncheck if session open\n")
  #look in env for an open session
  if ((eval(quote(is.na(remdir$sessionid)),envir = env)))
    stop("ERROR NO SESSION ID open new one")
  cat("session found\n")
  #accept xpath expression as is
  xp <- substitute(xp)
  txt<-c()
  #build the call to env
  cat("calling\n")
  call<-paste0("remdir$findElements(using = \"xpath\",\"",as.character(xp),"\")")
  tgt<-eval(as.name(call),envir = env)
  cat("Target locked\n")
  txt<-lapply(tgt,function(c){c$getElementText()})
  return(txt)
}

Возможный вызов этой функции может быть fun.XpathExtractText("//*",env) Но вскоре после части сборки вызова появляется сообщение об ошибке:

Error in eval(expr, envir, enclos) : 
 object 'remdir$findElements(using = "xpath","//*")' not found 

но если я выполню в env напрямую вызов, извлеченный из сообщения об ошибке, он будет работать.

tgt<-remdir$findElements(using = "xpath","//*")

Я пытался передать в качестве среды также сам remdir, поскольку это среда, но это вообще не считается, функция застревает в той же точке после сборки вызова. Что я не знаю?


person Malacoda    schedule 26.11.2016    source источник
comment
remdir — объект ссылочного класса. Вы можете передать его в свою функцию. Он будет передан по ссылке. Затем вы можете использовать его внутри своей функции, как и снаружи.   -  person jdharrison    schedule 26.11.2016
comment
Большое спасибо!!! в любом случае if ((eval(quote(is.na(remdir$sessionid)),envir = env)))) это работало, поэтому мне было интересно, почему. В любом случае, вы решили мою проблему, еще раз спасибо.   -  person Malacoda    schedule 26.11.2016


Ответы (2)


Не уверен, что именно вы пытаетесь сделать. Однако eval не кажется ответом. Вы должны передать объект remoteDriver в свою функцию:

library(RSelenium)

url="http://stackoverflow.com/search?q=r+program"
remdir<-remoteDriver(remoteServerAddr = "localhost", port = 4444, browserName = "firefox")
remdir$open()
remdir$navigate(url)

fun.XpathExtractText<-function(xp, remdir)
{
  cat("\ncheck if session open\n")
  #look in env for an open session
  if (is.na(remdir$sessionid))
    stop("ERROR NO SESSION ID open new one")
  cat("session found\n")
  #accept xpath expression as is
  cat("calling\n")
  tgt <- remdir$findElements(using = "xpath",as.character(xp))
  cat("Target locked\n")
  txt<-lapply(tgt,function(c){c$getElementText()})
  return(txt)
}
person jdharrison    schedule 26.11.2016

Извините, я не был достаточно ясен, в любом случае я пытался создать функцию, которая могла бы принимать xpath и возвращать текст найденного элемента, я хотел бы расширить это, чтобы получить также значение атрибута и другие вещи, чтобы все было в одном row с возможностью программного изменения xpath. Частично это своего рода упражнение, которое я сделал, чтобы понять eval, replace и т. д., по крайней мере, это была первая мысль.

В любом случае это работает:

fun.XpathExtractText<-function(xp,dir)
{
  #look in env for an open session
  if (is.na(dir$sessionid))
    stop("ERROR NO SESSION ID open new one")
  #accept xpath expression as is
  xp <- substitute(xp)
  txt<-c()
  tgt<-dir$findElements(using = "xpath",xp)
  txt<-lapply(tgt,function(c){c$getElementText()})
  return(txt)
}

Просто передайте в качестве имени имя удаленного драйвера.

person Malacoda    schedule 26.11.2016