Возвращает значение цикла for (), как если бы это была функция в R - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть этот цикл 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 голосов
/ 01 февраля 2019

Если ваше намерение состоит в том, чтобы (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 -versus- mapply аналогично lapply* 1031-vs *.Для обоих первых всегда возвращает объект list, в то время как вторые возвращают vector IFF, каждое возвращаемое значение имеет одинаковую длину / размерность, в противном случае оно также возвращает list.

...