我正在用R编写一个服务器程序,我在其中上载PDF文件,然后从PDF内的表中提取数据。
如果有所需的表和数据,它就能正常工作。但如果没有,它会给我文件[i]13和文件[i]14的错误。
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中没有表格,上面的代码对我来说就不起作用了。
我做错了什么?
请帮帮我。
1条答案
按热度按时间vmjh9lq91#
您的代码存在多个问题。
首先,
files = {}
可以工作,但几乎可以肯定它没有达到您的预期效果。您是指files = list()
吗?否则,表达代码功能的惯用方法是用R编写files = NULL
。* 更 * 惯用的方法是根本不赋值空对象。实际上,您的代码无论如何都会覆盖files
的初始值。因此files = {}
是完全冗余;接下来的两个作业也是如此。接下来,由于
files
是一个列表,因此需要使用双括号从中提取单个元素:files[[i]]
不是files[i]
。代码的另一个问题是R中的赋值总是局部的,因此
cost_price_list[i] = NA
在错误处理函数中创建了一个 * 局部变量 *,即使cost_price_list
存在于外部作用域中。如果你想赋值给外部变量,你需要显式地指定作用域(或者使用
<<-
,但是我建议不要这样做):但是这仍然是行不通的,因为这些变量没有一个值可以有意义地被子集化(并且还不完全清楚你的代码试图做什么),我仍然希望上面的内容能给你一个工作的基础。