我正在用 R 编写一个服务器程序,我在其中上传 PDF 文件,然后从 pdf 内的表格中提取数据。
如果有需要的表格和数据,就可以正常工作。但如果没有,它会给我文件[i][[1]][[3]]和文件[i][[1]][[4]]的错误。
error: subscript out of bounds
如果表格不存在,我想将买入和卖出价格的值默认为 NA。
all_data <- eventReactive(input$done, {
req(input$files)
files = {}
cost_price_list = {}
sell_price_list = {}
df <- data.frame(cost_price_list = character(), sell_price_list = character())
files <- lapply(input$files$datapath, extract_tables)
for (i in 1:length(input$files$datapath))
{
tryCatch(
{
cost_price_list <- files[i][[1]][[3]]
sell_price_list <- files[i][[1]][[4]]
},
error=function(cond) {
cost_price_list[i] = NA
sell_price_list[i] = NA
}
)
df[nrow(df) + 1,] <- c(cost_price_list[i],sell_price_list[i])
}
#return dataframe as table
df
})
但是如果 pdf 中没有表格,上面的代码对我不起作用。
我做错了什么?
请帮忙。
您的代码存在多个问题。
首先,
files = {}
可以工作,但几乎可以肯定不会达到您的预期。您的意思是files = list()
吗?否则,表达代码功能的惯用方式是在 R 中编写 files = NULL
。 more 惯用方式是根本不分配空对象。事实上,您的代码无论如何都会覆盖 files
的初始值,因此 files = {}
完全是多余的;接下来的两个作业也是如此。
接下来,由于
files
是一个列表,因此您需要使用双括号从中提取单个元素:files[[i]]
,而不是 files[i]
。
代码的另一个问题是R 中的赋值始终是本地的。因此
cost_price_list[i] = NA
在错误处理函数内创建一个 局部变量,即使 cost_price_list
存在于外部作用域中。
如果要分配给外部变量,则需要显式指定范围(或使用
<<-
,但我建议不要这种做法):
…
outer = environment()
for (i in 1:length(input$files$datapath))
{
tryCatch(
{
cost_price_list <- files[i][[1]][[3]]
sell_price_list <- files[i][[1]][[4]]
},
error=function(cond) {
outer$cost_price_list[i] = NA
outer$sell_price_list[i] = NA
}
)
df[nrow(df) + 1,] <- c(cost_price_list[i],sell_price_list[i])
}
…
但是这个still不起作用,因为这些变量没有可以有意义地子集化的值(并且并不完全清楚您的代码试图做什么)。尽管如此,我希望上述内容能为您提供工作基础。