我在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
集成到已经可用的刮板中。
我需要它来沿着流程返回文档,而不仅仅是这样:
处理器配置:
即使您不熟悉NiFi,在R方面也会有很大帮助!谢谢
答案 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])
# ...
lapply
和Map
之间最大的区别在于,lapply
仅可以接受一个向量,而Map
可以接受一个或多个(几乎没有限制),将它们拉在一起。使用的所有列表的长度必须相同或长度为1(可循环使用),因此执行类似的操作是合法的
Map(myfunc, list1, list2, "constant string")
注意:Map
-对-mapply
与lapply
-vs-sapply
类似。对于这两者,第一个总是返回一个list
对象,而第二个将返回一个vector
IFF,每个返回值的长度/尺寸都相同,否则它也将返回list
。