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

Why does my function work just at the beginning of its code?

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

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"

首先,由于您的输出包含打印的 URL,看起来整个函数体都已执行。

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

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

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

icms_data <- function(...){

     <everything else you wrote>

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

更多背景信息: 您在函数内部使用 <-= 进行的变量赋值是 local 函数环境变量,这意味着它们在函数体之外不可用。如果你想在函数之外使用这些变量,你需要 (a) return 如上所述或 (b) 将它们分配给不同的环境(例如使用 <<- 设置 "global variables") .通常应该避免选项 (b),除非您详细了解您正在做的事情的含义,否则它会导致很难调试的名称冲突。