在R中如何像在Java中那样处理异常?

oxcyiej7  于 2023-01-28  发布在  Java
关注(0)|答案(1)|浏览(144)

我正在用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中没有表格,上面的代码对我来说就不起作用了。
我做错了什么?
请帮帮我。

vmjh9lq9

vmjh9lq91#

您的代码存在多个问题。
首先,files = {}可以工作,但几乎可以肯定它没有达到您的预期效果。您是指files = list()吗?否则,表达代码功能的惯用方法是用R编写files = NULL。* 更 * 惯用的方法是根本不赋值空对象。实际上,您的代码无论如何都会覆盖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])
    }
    …

但是这仍然是行不通的,因为这些变量没有一个值可以有意义地被子集化(并且还不完全清楚你的代码试图做什么),我仍然希望上面的内容能给你一个工作的基础。

相关问题