Vậy thì: chào mừng bạn đến với thế giới R ;-)
Bạn đi đây
Thiết lập mã
urls <- c(
"http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
"http://en.wikipedia.org/wiki/Xz",
"xxxxx"
)
readUrl <- function(url) {
out <- tryCatch(
{
# Just to highlight: if you want to use more than one
# R expression in the "try" part then you'll have to
# use curly brackets.
# 'tryCatch()' will return the last evaluated expression
# in case the "try" part was completed successfully
message("This is the 'try' part")
readLines(con=url, warn=FALSE)
# The return value of `readLines()` is the actual value
# that will be returned in case there is no condition
# (e.g. warning or error).
# You don't need to state the return value via `return()` as code
# in the "try" part is not wrapped insided a function (unlike that
# for the condition handlers for warnings and error below)
},
error=function(cond) {
message(paste("URL does not seem to exist:", url))
message("Here's the original error message:")
message(cond)
# Choose a return value in case of error
return(NA)
},
warning=function(cond) {
message(paste("URL caused a warning:", url))
message("Here's the original warning message:")
message(cond)
# Choose a return value in case of warning
return(NULL)
},
finally={
# NOTE:
# Here goes everything that should be executed at the end,
# regardless of success or error.
# If you want more than one expression to be executed, then you
# need to wrap them in curly brackets ({...}); otherwise you could
# just have written 'finally=<expression>'
message(paste("Processed URL:", url))
message("Some other message at the end")
}
)
return(out)
}
Áp dụng mã
> y <- lapply(urls, readUrl)
Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
Some other message at the end
Processed URL: http://en.wikipedia.org/wiki/Xz
Some other message at the end
URL does not seem to exist: xxxxx
Here's the original error message:
cannot open the connection
Processed URL: xxxxx
Some other message at the end
Warning message:
In file(con, "r") : cannot open file 'xxxxx': No such file or directory
Điều tra đầu ra
> head(y[[1]])
[1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"
[2] "<html><head><title>R: Functions to Manipulate Connections</title>"
[3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
[4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"
[5] "</head><body>"
[6] ""
> length(y)
[1] 3
> y[[3]]
[1] NA
Nhận xét bổ sung
cố gắng bắt
tryCatch
trả về giá trị liên quan đến thực thi expr
trừ khi có lỗi hoặc cảnh báo. Trong trường hợp này, các giá trị trả về cụ thể (xem return(NA)
ở trên) có thể được chỉ định bằng cách cung cấp một hàm xử lý tương ứng (xem các đối số error
và warning
trong ?tryCatch
). Đây có thể là các hàm đã tồn tại, nhưng bạn cũng có thể định nghĩa chúng trong tryCatch()
(như tôi đã làm ở trên).
Ý nghĩa của việc chọn giá trị trả về cụ thể của các hàm xử lý
Như chúng tôi đã chỉ định NA
sẽ được trả lại trong trường hợp có lỗi, phần tử thứ ba y
là NA
. Nếu chúng ta muốn đã chọn NULL
được giá trị trả về, chiều dài của y
sẽ chỉ đã 2
thay vì 3
như lapply()
sẽ chỉ đơn giản là "bỏ qua" giá trị trả lại được NULL
. Cũng lưu ý rằng nếu bạn không chỉ định giá trị trả về rõ ràng thông qua return()
, các hàm xử lý sẽ trả về NULL
(nghĩa là trong trường hợp có lỗi hoặc điều kiện cảnh báo).
Thông điệp cảnh báo "không mong muốn"
Vì warn=FALSE
dường như không có bất kỳ ảnh hưởng nào, một cách khác để ngăn chặn cảnh báo (trong trường hợp này không thực sự đáng quan tâm) là sử dụng
suppressWarnings(readLines(con=url))
thay vì
readLines(con=url, warn=FALSE)
Nhiều biểu thức
Lưu ý rằng bạn cũng có thể đặt nhiều biểu trong "phần biểu thức thực tế" (lập luận expr
của tryCatch()
) nếu bạn bọc chúng trong dấu ngoặc móc (giống như tôi đã minh họa trong finally
phần).
paste
hàm của bạn kết thúc bằng một khoảng trắng, tại sao không bỏ qua khoảng trắng và dấusep=""
?