rvest,html_nodes()错误:不能强制类型'环境'到矢量类型' list'。失败RScript,适用于Session

时间:2016-02-11 22:35:54

标签: r rvest

html_nodes()函数在作为可执行的RScript运行时失败,但在交互式运行时成功。有人知道在跑步中会有什么不同吗?

交互式运行使用全新会话运行,源语句是第一次运行。

$ ./test-pdp.R
>
> ################################################################################
> # Setup
> ################################################################################
> suppressPackageStartupMessages(library(plyr))
> suppressPackageStartupMessages(library(dplyr))
> suppressPackageStartupMessages(library(stringr))
> suppressPackageStartupMessages(library(rvest))
> suppressPackageStartupMessages(library(httr))
>
>
> read_html("http://google.com") %>%
+     html_nodes("div") %>%
+     length()
Error in as.vector(x, "list") :
  cannot coerce type 'environment' to vector of type 'list'
Calls: %>% ... <Anonymous> -> lapply -> as.list -> as.list.default
Execution halted

然而,当以source()交互式运行时,它会成功:

> source("/Users/a6001389/Documents/projects/hottest-deals-page-scrape/src/test-pdp.R", echo=TRUE)
> #!/usr/bin/RScript
> options(echo=TRUE)
> ################################################################################
> # Setup
> ####################################################### .... [TRUNCATED] 
> suppressPackageStartupMessages(library(dplyr))
> suppressPackageStartupMessages(library(stringr))
> suppressPackageStartupMessages(library(rvest))
> suppressPackageStartupMessages(library(httr))
> read_html("http://google.com") %>%
+     html_nodes("div") %>%
+     length()
[1] 17

谢谢你, 马特

2 个答案:

答案 0 :(得分:6)

添加行:

if( $.trim($("#NameField").val()) == "" || $.trim($("#EmailField").val()) == "" || !$('#Options:checked').length ) {
    console.log("email wrong");
    $("#email_wrong").html("* Please fill in all fields.");
    $("#email_wrong").fadeIn();
}

根据Hadley Wickham对原始问题的评论确实解决了这个错误。为什么它解决了这个错误,我不知道。但我发布了一个答案,所以这里有一个容易引用的解决方案。如果为什么这解决了问题的发布,我会接受这个答案。

将@ mekki-macaulay下面的评论添加到文本中,因为它确实增加了一些清晰度:

  

这个帖子可能会对它有所了解。似乎在某些情况下,RSCRIPT默认情况下不加载package :: methods,而交互式会话默认加载它。似乎“何时”并不清楚,但明确调用所有RSCRIPT执行的库(方法)似乎是安全的选择:can use package interactively, but Rscript gives errors

答案 1 :(得分:-1)

这可能是magrittr::%>%运算符工作方式的副作用。来自Magrittr Documentation - Page 8: %>% Pipe

  

magrittr管道运营商使用非标准评估。他们捕获他们的输入并检查它们以确定如何继续。首先,从所有单独的右侧表达式产生函数,然后通过将该函数应用于左侧来获得结果。在大多数情况下,人们可以忽略magrittr评估的微妙方面,但是有些函数可能会捕获它们的调用环境,因此使用运算符将​​不会完全等同于没有管道运算符的“标准调用” (强调我的)。

因此,请在没有%>%的情况下尝试查看是否因为html_nodes错误地从命令行捕获环境(如您的错误消息所示),而在交互式会话中,它可以抓取会议的环境变量:

google_node <- read_html("http://google.com");
div_nodes   <- html_nodes(google_node, "div");
length(div_nodes);

当作为可执行的RScript调用时,它是否有效?