我在这里遇到的问题是,显然,该函数正在执行的唯一代码行是
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时,它看起来像是执行整个函数体。
根据函数的名称判断,我假设您希望它返回变量icms
。
R是一种函数式编程语言,因此函数返回它们最后执行的表达式作为结果。
因此,您应该将icms
或return(icms)
放在函数的最后:
icms_data <- function(...){
<everything else you wrote>
icms<-rbind(icms,df)
print(paste(url))
icms
}
更多背景信息:使用<-
或=
在函数内部执行的变量赋值是函数环境的局部变量,这意味着它们在函数体外部不可用。如果您希望这些变量在函数之外,您需要(a)如上所述返回它们或(b)将它们分配给不同的环境(例如使用<<-
设置“全局变量”)。通常应避免使用选项(b),除非您知道详细信息的含义,否则会导致很难调试的名称冲突。