的for()循环返回值,好像它是R中的函数

时间:2019-02-01 17:46:01

标签: r for-loop apache-nifi

我在for脚本中有这个R循环:

url <- "https://example.com"
page <- html_session(url, config(ssl_verifypeer = FALSE))

links <- page %>% 
  html_nodes("td") %>% 
  html_nodes("tr") %>%
  html_nodes("a") %>% 
  html_attr("href")

base_names <- page %>%
  html_nodes("td") %>% 
  html_nodes("tr") %>%
  html_nodes("a") %>% 
  html_attr("href") %>%
  basename()

for(i in 1:length(links)) {

  site <- html_session(URLencode(
    paste0("https://example.com", links[i])),
    config(ssl_verifypeer = FALSE))

  writeBin(site$response$content, base_names[i])
} 

这会循环链接,并将文本文件下载到我的工作目录中。我想知道是否可以将return放在某个地方,以便它返回文档。

原因是,我正在NiFi中执行脚本(使用ExecuteProcess),并且没有将我抓取的文档发送到一行。相反,它仅显示我的R脚本的开头。我假设您会将for循环包装在fun <- function(x) {}中,但是我不确定如何将x集成到已经可用的刮板中。

我需要它来沿着流程返回文档,而不仅仅是这样:

enter image description here

处理器配置:

enter image description here

即使您不熟悉NiFi,在R方面也会有很大帮助!谢谢

1 个答案:

答案 0 :(得分:2)

如果您要同时(1)保存输出(使用writeBin)和,并且(2)返回值(使用list),请尝试执行此操作:

out <- Map(function(ln, bn) {
  site <- html_session(URLencode(
    paste0("https://example.com", ln)),
    config(ssl_verifypeer = FALSE))
  writeBin(site$response$content, bn)
  site$response$content
}, links, base_names)

使用Map将各个元素“压缩”在一起。对于基本情况,以下内容是相同的:

Map(myfunc, list1)
lapply(list1, myfunc)

但是,如果要使用多个列表中的相同索引元素,则可以执行以下操作之一

lapply(seq_len(length(list1)), function(i) myfunc(list1[i], list2[i], list3[i]))
Map(myfunc, list1, list2, list3)

展开Map会有效地导致:

myfunc(list1[1], list2[1], list3[1])
myfunc(list1[2], list2[2], list3[2])
# ...

lapplyMap之间最大的区别在于,lapply仅可以接受一个向量,而Map可以接受一个或多个(几乎没有限制),将它们拉在一起。使用的所有列表的长度必须相同或长度为1(可循环使用),因此执行类似的操作是合法的

Map(myfunc, list1, list2, "constant string")

注意:Map-对-mapplylapply-vs-sapply类似。对于这两者,第一个总是返回一个list对象,而第二个将返回一个vector IFF,每个返回值的长度/尺寸都相同,否则它也将返回list