将ifelse()添加到Map函数

时间:2019-02-19 17:24:47

标签: r if-statement

我有一个简单的Map函数,可从博客站点抓取文本文件。获取所有文本文件并将其下载到我的工作目录中的刮板非常容易。我的目标是:使用ifelse()或纯if语句仅根据特定日期来抓取文件。

例如,如果在1/31/19上发布了四个文件,而我当时指的是ifelse,则该函数将返回这四个文件。代码:

library(tidyverse)
library(rvest)

# URL set up
url <- "https://www.example-blog/posts.aspx"
page <- html_session(url, config(ssl_verifypeer = FALSE))

# Picking elements
links <- page %>% 
  html_nodes("td") %>% 
  html_nodes("a") %>% 
  html_attr("href") 

# Getting date elements
dates <- page %>%
  html_nodes("node.dates") %>% 
  html_text()

dates <- parse_date_time(dates, "%m/%d/%Y", tz = "EST", 
                     locale = Sys.getlocale("LC_TIME"))

# Function 
out <- Map(function(ln) {

fun1 <- html_session(URLencode(
  paste0("https://www.example-blog", ln)),
  config(ssl_verifypeer = FALSE))

write <- writeBin(fun1$response$content)

ifelse(dates == '2019-01-31', write, "He's dead, Jim")

}, links)

我尝试了多种方法来获取if语句,还可以移动writeBin。 (通常,writeBin不会被矢量化-我这样做是为了在我的ifelse中轻松查看)。错误:

Error in ans[test & ok] <- rep(yes, length.out = length(ans))[test & ok] : 
   replacement has length zero 

如果我省去了if代码,那么一切都很好,当我只需要指定日期的文本文件时,它只会返回许多文本文件。

1 个答案:

答案 0 :(得分:1)

根据描述,似乎要检查每个“链接”的相应“日期”,然后应用if/else。如果是这样,那么我们可以在Map

中有两个参数
Map(function(ln, y) {
     fun1 <- html_session(URLencode(
           paste0("https://www.example-blog", ln)),
              config(ssl_verifypeer = FALSE))

        write <- writeBin(fun1$response$content)

      if(y == '2019-01-31') {
        write 
      } else  "He's dead, Jim"
     },
         links, dates)