m == q 中的错误:R 比较 (1) 仅适用于原子和列表类型

Posted

技术标签:

【中文标题】m == q 中的错误:R 比较 (1) 仅适用于原子和列表类型【英文标题】:Error in m == q : R comparison (1) is possible only for atomic and list types 【发布时间】:2022-01-22 14:59:54 【问题描述】:

我需要将 for 循环转换为应用优化的整个函数

plans_achievements <- function(pa_m,pa_q)
             if(nrow(pa_m)==0 & nrow(pa_q==0))
                df = data.frame(a = c(""), b = c("No Data Available"))
                colnames(df)=""
              else
                pa_m= pa_m%>% select(inc,month_year,Plans,Achievements,quarter_year)
                colnames(pa_mon)[2] = "Period"
        
        pa_q= pa_q%>% select(inc,quarter_year,Plans,Achievements)
        colnames(pa_qtr)[2] = "Period"
        
        df = data.frame(inc=c(""),Period=c(""),Plans=c(""),Achievements=c(""))
        
        for (q in unique(pa_q$Period))
          df1 = pa_q[pa_q$Period==q,]
          df1$Period = paste0("<span style=\"color:#288D55\">",df1$Period,"</span>")
          df1$Plans = paste0("<span style=\"color:#288D55\">",df1$Plans,"</span>")
          df1$Achievements = paste0("<span style=\"color:#288D55\">",df1$Achievements,"</span>")
          df = rbind(df,df1)
          for (m in unique(pa_m$quarter_year))
            if(m==q)
              df2 = pa_m[pa_m$quarter_year==q,][-5]
              df = rbind(df,df2)
            
          
        
        df = df[-1,]
      
        return(df)
        

我尝试过的应用

my_fun <- function(q)
      df1 = pa_qtr[pa_qtr$Period==q,]
      df1$Period = paste0("<span style=\"color:#288D55\">",df1$Period,"</span>")
      df1$Plans = paste0("<span style=\"color:#288D55\">",df1$Plans,"</span>")
      df1$Achievements = paste0("<span style=\"color:#288D55\">",df1$Achievements,"</span>")
      df = rbind(df,df1)


    
    df = do.call(rbind,lapply(unique(pa_qtr$Period), my_fun))
    
    my_fun2 <- function(m,my_fun)
      if (m == q) 
        df2 = pa_mon[pa_mon$qtr_yr == q, ][-5]
        df = rbind(df,df2)
      
    
    df = do.call(cbind,lapply(unique(pa_mon$qtr_yr), my_fun2))

DT::datatable(plans_achievements(pa_m[pa_m$inc=="vate",],pa_q[pa_q$inc=="vate",]), rownames = F,escape = FALSE,selection=list(mode ="single",target="row"),options = list(pageLength = 50,scrollX = TRUE,dom = 'tp',ordering=F,columnDefs = list(list(visible=FALSE, targets=c(0) ),list(className = 'dt-left', 目标 = '_all'))))

【问题讨论】:

【参考方案1】:

为什么会出现错误comparison is possible only for atomic and list types

我会先回答你原来的问题:

您收到错误是因为您没有将q 定义为函数my_fun2 内的变量。由于您尚未定义此变量,R 将在全局环境中查找它。在那里 R 会找到 function q()(用于退出 R)。所以你会收到错误消息 comparison (1) is possible only for atomic and list types,因为 R 认为你正在尝试将数字 m 与函数 q 进行比较。

下面是一个小例子,便于查看:

# Run this in a clean environment

m <- 1

m == b # Understandable error message - "b" is not found
m == q # Your error - because R thinks you are comparing m to a function

您可以通过确保在您的函数中定义 q 来修复此错误。通过在函数内部创建它,或者将其作为输入参数提供。

您的问题的可能解决方案

据我了解,您希望对pa_qpa_m 中的值进行格式化、合并和排序,以将它们显示在html 表格中。

Under 是一个可能的解决方案,使用 tidyverse 和矢量化操作,而不是循环或应用函数。矢量化函数通常是您在 R 中最快的选择,因为我知道您想优化您的代码。

library(dplyr)


plans_achievements <- function(pa_m, pa_q) 
  
  # I've modified the logic a bit: there is no need to wrap the full function in
  # an else statement, since we can return early if the data has no rows
  if (nrow(pa_m) == 0 && nrow(pa_q == 0)) 
    df = data.frame(a = c(""), b = c("No Data Available"))
    colnames(df) = ""
    
    return(df)
    
  
  
  pa_q <- 
    pa_q %>% 
    # Select and rename the columns vi need
    select(inc, Period = quarter_year, Plans, Achievements, date) %>% 
    # Format the values
    mutate(
      Period = paste0("<span style=\"color:#288D55\">", Period,"</span>"),
      Plans = paste0("<span style=\"color:#288D55\">", Plans,"</span>"),
      Achievements = paste0("<span style=\"color:#288D55\">", Achievements,"</span>")
    )
  
  pa_m <- 
    pa_m %>% 
    # Select and rename the columns we need
    select(inc, Period = month_year, Plans, Achievements, date) #%>% 
  
  # Combine the datasets
  bind_rows(
    pa_q, 
    pa_m
  ) %>% 
    # Make sure that R understand date as a date value
    mutate(
      date = lubridate::dmy(date)
    ) %>% 
    # Sort by date
    arrange(desc(date)) %>% 
    # Remove columns we do not need
    select(-date, -inc)
  



DT::datatable(
  plans_achievements(
    pa_m[pa_m$inc=="vate",],
    pa_q[pa_q$inc=="vate",]
  ), 
  rownames = FALSE,
  escape = FALSE,
  selection = list(mode = "single", target = "row"),
  options = list(
    pageLength = 50,
    scrollX = TRUE,
    dom = 'tp',
    ordering = FALSE,
    columnDefs = list(
      list(className = 'dt-left', targets = '_all')
    )
  )
)

希望这能解决您的问题。

【讨论】:

当我尝试提供多个输入时,它显示 FUN(X[[i]], ...) 中的错误:缺少参数“q”,没有默认值 当您不提供函数所需的输入时,您会收到该错误消息。您可以将q = &lt;value&gt; 提供给lapply(),但我认为它不会满足您的要求。如上所述,您需要根据您的用例调整我的示例,因为我不知道您想要实现什么。如果您 (1) 解释了您希望您的代码做什么,并且 (2) 提供了一个最小的代表,那么帮助您会容易得多。在此处阅读有关如何执行此操作的更多信息:***.com/help/minimal-reproducible-example 谢谢。我已经用可能的解决方案为您更新了我的答案。我不使用应用函数,而是使用来自 tidyverse 的矢量化函数,我认为这是一个更好的解决方案。希望这能解决您的问题。 而且我在使用您的代码时也遇到了错误mutate()date 的问题。我date = lubridate::dmy(date)。 i 所有格式都无法解析。未找到任何格式。 在您问题的示例数据中,pa_q$datepa_m$date 是格式为dd-mm-yyyy 的字符向量,例如"15-06-2020"lubridate::dmy() 应该可以正常使用此输入 - 它在我的计算机上工作 - 所以你的问题可能与其他问题有关。你有安装包 lubridate 吗?您的数据与您在问题中提供的数据不同吗?

以上是关于m == q 中的错误:R 比较 (1) 仅适用于原子和列表类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥 F# 中的幂运算符仅适用于浮点数?

Vue .sync 仅适用于 v-model,但会出现突变错误

对象 addSubview 仅适用于 viewDidLoad

Group By仅适用于某些列

在线等 数据库关系模式 R=(M,N,P, Q), 依赖集F= M N→Q, N→P, MP→N

在 R 中绘制 ROC 曲线时出错 - UseMethod("predict") 中的错误:没有适用于“预测”的方法应用于“因子”类的对象