为什么我的函数只在其代码的开头工作?
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 它们最后执行的表达式作为它们的结果。
因此,您应该将 icms
或 return(icms)
放在函数的最后:
icms_data <- function(...){
<everything else you wrote>
icms<-rbind(icms,df)
print(paste(url))
icms
}
更多背景信息: 您在函数内部使用 <-
或 =
进行的变量赋值是 local 函数环境变量,这意味着它们在函数体之外不可用。如果你想在函数之外使用这些变量,你需要 (a) return 如上所述或 (b) 将它们分配给不同的环境(例如使用 <<-
设置 "global variables") .通常应该避免选项 (b),除非您详细了解您正在做的事情的含义,否则它会导致很难调试的名称冲突。
我在这里遇到的问题是,显然,该函数正在执行的唯一代码行是
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 它们最后执行的表达式作为它们的结果。
因此,您应该将 icms
或 return(icms)
放在函数的最后:
icms_data <- function(...){
<everything else you wrote>
icms<-rbind(icms,df)
print(paste(url))
icms
}
更多背景信息: 您在函数内部使用 <-
或 =
进行的变量赋值是 local 函数环境变量,这意味着它们在函数体之外不可用。如果你想在函数之外使用这些变量,你需要 (a) return 如上所述或 (b) 将它们分配给不同的环境(例如使用 <<-
设置 "global variables") .通常应该避免选项 (b),除非您详细了解您正在做的事情的含义,否则它会导致很难调试的名称冲突。