Почему моя функция работает только в начале своего кода? - PullRequest
0 голосов
/ 14 декабря 2018

Проблема, с которой я столкнулся, заключается в том, что, по-видимому, единственные строки кода, которые выполняет функция, это

library(rvest)
library(RCurl)

и url <-paste("https://www.confaz.fazenda.gov.br/legislacao/boletim-do-icms/",estate,"/",year,month,sep=""), как вы, ребята, можете видеть в конце кода,

Так что я думаю, что функция не может присвоить значения ни одной из переменных.Ребята, не могли бы вы сказать мне, как я мог решить эту проблему?

Я знаю, что могу видеть, что происходит, более подробно, используя отладку, но у меня тоже возникают трудности с этим.

icms_data <- function(estate, year, month){



  # Creating a data frame
  icms<- data.frame(NULL)

  library(rvest)
  library(RCurl)



  #downloading the webpage with the arguments from the function(estate, year and month)
  url <-paste("https://www.confaz.fazenda.gov.br/legislacao/boletim-do-icms/",estate,"/",year,month,sep="")
  #ignore token validation
  options(RCurlOptions = 
            list(capath = system.file("CurlSSL", 
                                      "cacert.pem", 
                                      package = "RCurl"), 
                 ssl.verifypeer = FALSE))

  y1<-getURL(url) 
  y <- read_html(y1)


  a<- y %>%
    html_nodes("#formfield-form-widgets-icms_primario div") %>%
    html_text()
  if(all.equal(a,character(0))==TRUE)
  {
    a=0
  } else
  {
    a<-substr(a,4,100)
    a = type.convert(a, na.strings = "NA", as.is = F, dec = ",",numerals = "no.loss")
  }

  b<- y %>%
    html_nodes("#formfield-form-widgets-icms_secundario div") %>%
    html_text()
  if(all.equal(b,character(0))==TRUE)
  {
    b=0
  } else
  {
    b<-substr(b,4,100)
    b = type.convert(b, na.strings = "NA", as.is = F, dec = ",",numerals = "no.loss")
  }
  #puting the information scraped into the data frame
  df<-data.frame(estate,year,month,a,b)
  icms<-rbind(icms,df)
  print(paste(url))
}

 > icms_data("SP","2018", "01")
Loading required package: xml2
Loading required package: bitops
[1] "https://www.confaz.fazenda.gov.br/legislacao/boletim-do-icms/SP/201801"

1 Ответ

0 голосов
/ 14 декабря 2018

Во-первых, поскольку ваш вывод содержит напечатанный URL, похоже, что выполняется все тело функции.

Судя по названию вашей функции, я предполагаю, что вы хотите, чтобы она возвращала переменную icms.

R является функциональным языком программирования, и поэтому такие функции возвращают свое последнее выполненное выражение в качестве результата.

Таким образом, вы должны поставить icms или return(icms) в самом конце вашей функции:

icms_data <- function(...){

     <everything else you wrote>

     icms<-rbind(icms,df)
     print(paste(url))
     icms
     }

Дополнительная справочная информация: назначения переменных, которые вы выполняете внутри функции с использованием <- или =, являются локальными переменными для функциональной среды,Это означает, что они не будут доступны за пределами тела функции.Если вы хотите, чтобы эти переменные находились вне функции, вам необходимо (а) вернуть их, как описано выше, или (б) присвоить их другой среде (например, установить «глобальные переменные», используя <<-).Варианта (b) следует вообще избегать, если вы не знаете последствий того, что вы делаете в деталях, так как в противном случае он может вызвать конфликты имен, которые очень трудно отладить.

...