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

问题描述 投票:0回答:1

我正在用 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 中没有表格,上面的代码对我不起作用。

我做错了什么?

请帮忙。

r shiny
1个回答
1
投票

您的代码存在多个问题。

首先,

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不起作用,因为这些变量没有可以有意义地子集化的值(并且并不完全清楚您的代码试图做什么)。尽管如此,我希望上述内容能为您提供工作基础。

© www.soinside.com 2019 - 2024. All rights reserved.