2016-11-26 17 views
2

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

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 

но если я exectute в окр непосредственно вызов извлекается из ошибки сообщения оно будет работать.

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

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

+0

'remdir' является объектом класса сравнения. Вы можете передать его в свою функцию. Он будет передан по ссылке. Затем вы можете использовать его внутри своей функции, как и снаружи. – jdharrison

+0

Большое спасибо !!! в любом случае 'if ((eval (quote (is.na (remdir $ sessionid)), envir = env))))' он работал, поэтому мне было интересно, почему. В любом случае, вы решили мою проблему, еще раз спасибо. – Malacoda

ответ

0

Не знаете, что именно вы пытаетесь сделать. Однако 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) 
} 
0

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

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

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

Просто пройти как реж имя remoteDriver.

 Смежные вопросы

  • Нет связанных вопросов^_^