2

私はおそらく何か明らかなことを見ていないでしょう.とにかく、リモートドライバーによって既に処理されている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 自体も環境として渡そうとしましたが、それはまったくカウントされません。ビルドの呼び出し後に関数が同じポイントでスタックします。私は何を知らないのですか?

4

2 に答える 2