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_q
和pa_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 = <value>
提供给lapply()
,但我认为它不会满足您的要求。如上所述,您需要根据您的用例调整我的示例,因为我不知道您想要实现什么。如果您 (1) 解释了您希望您的代码做什么,并且 (2) 提供了一个最小的代表,那么帮助您会容易得多。在此处阅读有关如何执行此操作的更多信息:***.com/help/minimal-reproducible-example
谢谢。我已经用可能的解决方案为您更新了我的答案。我不使用应用函数,而是使用来自 tidyverse 的矢量化函数,我认为这是一个更好的解决方案。希望这能解决您的问题。
而且我在使用您的代码时也遇到了错误mutate()
列date
的问题。我date = lubridate::dmy(date)
。 i 所有格式都无法解析。未找到任何格式。
在您问题的示例数据中,pa_q$date
和pa_m$date
是格式为dd-mm-yyyy
的字符向量,例如"15-06-2020"
。 lubridate::dmy()
应该可以正常使用此输入 - 它在我的计算机上工作 - 所以你的问题可能与其他问题有关。你有安装包 lubridate 吗?您的数据与您在问题中提供的数据不同吗?以上是关于m == q 中的错误:R 比较 (1) 仅适用于原子和列表类型的主要内容,如果未能解决你的问题,请参考以下文章
Vue .sync 仅适用于 v-model,但会出现突变错误
对象 addSubview 仅适用于 viewDidLoad
在线等 数据库关系模式 R=(M,N,P, Q), 依赖集F= M N→Q, N→P, MP→N
在 R 中绘制 ROC 曲线时出错 - UseMethod("predict") 中的错误:没有适用于“预测”的方法应用于“因子”类的对象