为什么我的函数只在其代码的开头工作?

问题描述 投票:0回答:1

我在这里遇到的问题是,显然,该函数正在执行的唯一代码行是

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"
r function web-scraping screen-scraping
1个回答
1
投票

首先,当您的输出包含打印的URL时,它看起来像是执行整个函数体。

根据函数的名称判断,我假设您希望它返回变量icms

R是一种函数式编程语言,因此函数返回它们最后执行的表达式作为结果。

因此,您应该将icmsreturn(icms)放在函数的最后:

icms_data <- function(...){

     <everything else you wrote>

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

更多背景信息:使用<-=在函数内部执行的变量赋值是函数环境的局部变量,这意味着它们在函数体外部不可用。如果您希望这些变量在函数之外,您需要(a)如上所述返回它们或(b)将它们分配给不同的环境(例如使用<<-设置“全局变量”)。通常应避免使用选项(b),除非您知道详细信息的含义,否则会导致很难调试的名称冲突。

© www.soinside.com 2019 - 2024. All rights reserved.