【问题标题】:Error in source("...") unexpected '=' despite all brackets lining up尽管所有括号都对齐,但源(“...”)意外'='中的错误
【发布时间】:2023-03-13 05:10:01
【问题描述】:

我想把我的头发拉到这个上......

我读过这样的代码

holidays <- read.csv("~/xxx/holiday_sample.csv") %>% 
  rename(DATE = "ï..DATE") %>% 
  mutate(DATE = as.Date(DATE,format = "%m/%d/%Y"))

##looks like this
structure(list(DATE = structure(c(17532, 17533, 17534, 17546, 
17547, 17548, 17549, 17575, 17576, 17577, 17620, 17621, 17622, 
17678, 17679, 17680, 17681, 17682, 17713, 17714, 17715, 17716, 
17717, 17774, 17775, 17776, 17777, 17778, 17812, 17847, 17855, 
17856, 17857, 17858, 17859, 17860, 17884, 17885, 17886, 17887, 
17888, 17889, 17890, 17891, 17892, 17893, 17894, 17895, 17896
), class = "Date"), REASON = c("New Years Day", "New Years Travel", 
"New Years Travel", "Lee-Jackson Day", "Lee-Jackson-King Travel Day", 
"Lee-Jackson-King Travel Day", "Martin Luther King, Jr. Day", 
"Presidents Day Travel", "Presidents Day Travel", "Presidents Day", 
"Easter Travel", "Easter Travel", "Easter", "Memorial Day Travel", 
"Memorial Day Travel", "Memorial Day Travel", "Memorial Day", 
"Memorial Day Travel", "Independence Day Travel", "Independence Day Travel", 
"Independence Day Travel", "Independence Day", "Independence Day Travel", 
"Labor Day Travel", "Labor Day Travel", "Labor Day Travel", "Labor Day", 
"Labor Day Travel", "Columbus Day", "Veterans Day", "Thanksgiving Travel", 
"Thanksgiving Travel", "Thanksgiving Day", "Thanksgiving Travel", 
"Thanksgiving Travel", "Thanksgiving Travel", "Christmas Travel", 
"Christmas Travel", "Christmas Travel", "Christmas Travel", "Christmas Travel", 
"Christmas Travel", "Christmas Day", "Christmas Travel", "Christmas Travel", 
"Christmas Travel", "Christmas Travel", "Christmas Travel", "New Years Travel"
)), class = "data.frame", row.names = c(NA, -49L))

我想通过另一个 df 循环查看哪些行发生在假期。

bottleneck2 <- structure(list(startTime = structure(c(1519903920, 1519905060, 
1519913640), class = c("POSIXct", "POSIXt"), tzone = "America/New_York"), 
    endTime = structure(c(1519904880, 1519912200, 1519914540), class = c("POSIXct", 
    "POSIXt"), tzone = "America/New_York"), impact = c(92.17, 
    616.43, 63.69), impactPercent = c(184.15, 1495.17, 138.69
    ), impactSpeedDiff = c(3587.72, 25726.22, 2616.01), maxQueueLength = c(5.76053, 
    5.76053, 4.829511), tmcs = list(c("110N04623", "110-04623", 
    "110N04624", "110-04624", "110N04625", "110-04625", "110N04626", 
    "110-04626", "110N04627"), c("110N04623", "110-04623", "110N04624", 
    "110-04624", "110N04625", "110-04625", "110N04626", "110-04626", 
    "110N04627"), c("110N04623", "110-04623", "110N04624", "110-04624", 
    "110N04625", "110-04625", "110N04626", "110-04626")), early_startTime = structure(c(1519903620, 
    1519904760, 1519913340), class = c("POSIXct", "POSIXt"), tzone = "America/New_York")), row.names = c(NA, 
3L), class = "data.frame")


但是当我运行以下命令时,我得到一个零意义的语法错误......

holiday_match <- lapply(1:nrow(bottleneck2), function(x) {
  
  bottleneck_row <- bottleneck2[x,]
  holidays[which(holidays$DATE = as.Date(bottleneck_row$early_startTime) | 
                   holidays$DATE = as.Date(bottleneck_row$endTime) == TRUE),]
  })


错误: Error: unexpected '}' in " }"

然后当我将文件保存在 R 中时,我又遇到了另一个错误。

Error in source("~/xxx/example.R") : 
  ~/xxx/example.R:226:32: unexpected '='
225:   bottleneck_row <- bottleneck2[x,]
226:   holidays[which(holidays$DATE =

看到另一个帖子说这可能是 Unicode 不匹配,但重新输入了两次,但没有成功。这是文件中另一个循环的复制和粘贴,完美运行....

【问题讨论】:

  • = vs ==,改为which(holidays$DATE == as.Date(...) | holidays$DATE == as.Date(...)。 (并且不需要== TRUE。)
  • 试了还是报错
  • > holiday_match }) 错误:“}”中出现意外的“}”
  • 是的(我正在查看,但请参阅stackoverflow.com/q/28176650/3358272 以了解=/== 的讨论,以防您不确定。(抱歉,如果您是,那只是一个错字。)
  • 给定此示例数据,您的预期输出是什么?

标签: r dplyr syntax tidyverse


【解决方案1】:

我认为您实际上尝试执行的操作是确定 bottleneck2 事件之一是否发生在假期。我认为更好的操作是合并/加入操作。由于您正在查看两个字段,我认为我们需要两个连接,但我认为这不会很昂贵,而且我们可以在之后进行清理,所以没关系。

对于这个例子,你的bottleneck2 没有发生在假期,所以我要“推动”其中两个发生在不同的假期......

bottleneck2 %>%
  # just to "bump" a couple of the rows into a holiday occurrence,
  # purely for demonstration
  mutate_if(~ inherits(., "POSIXt"),
            ~ . + c(0, 29, 31) * 86400) %>%
  # add a "_date" column for each so that we can "join" on the
  # date-version of each timestamp
  mutate_at(vars(early_startTime, endTime),
            list(date = ~ trunc(as.Date(.)))) %>%
  left_join(holidays, by = c(early_startTime_date = "DATE")) %>%
  left_join(holidays, by = c(endTime_date = "DATE")) %>%
  mutate(REASON = coalesce(REASON.x, REASON.y)) %>%
  select(-REASON.x, -REASON.y, -ends_with("_date"))
#             startTime             endTime impact impactPercent impactSpeedDiff maxQueueLength                                                                                              tmcs     early_startTime        REASON
# 1 2018-03-01 06:32:00 2018-03-01 06:48:00  92.17        184.15         3587.72       5.760530 110N04623, 110-04623, 110N04624, 110-04624, 110N04625, 110-04625, 110N04626, 110-04626, 110N04627 2018-03-01 06:27:00          <NA>
# 2 2018-03-30 07:51:00 2018-03-30 09:50:00 616.43       1495.17        25726.22       5.760530 110N04623, 110-04623, 110N04624, 110-04624, 110N04625, 110-04625, 110N04626, 110-04626, 110N04627 2018-03-30 07:46:00 Easter Travel
# 3 2018-04-01 10:14:00 2018-04-01 10:29:00  63.69        138.69         2616.01       4.829511            110N04623, 110-04623, 110N04624, 110-04624, 110N04625, 110-04625, 110N04626, 110-04626 2018-04-01 10:09:00        Easter

现在您有一个 REASON 字段(最右侧),即假日名称或 NA 否则。

从这里开始,如果您需要知道哪个bottleneck2 匹配假日,只需使用filter(!is.na(REASON)),您就会遇到所有匹配的瓶颈。


要回答您关于为什么语法不正确的问题,请参阅此(将= 修复为== 后):

holiday_match <- lapply(1:nrow(bottleneck2), function(x) {
  bottleneck_row <- bottleneck2[x,]
  holidays[which(holidays$DATE == as.Date(bottleneck_row$early_startTime) | 
                   holidays$DATE == as.Date(bottleneck_row$endTime) == TRUE),]
})

让我们深入了解:

holidays[which(holidays$DATE == as.Date(bottleneck_row$early_startTime) | 
                   holidays$DATE == as.Date(bottleneck_row$endTime) == TRUE),]

具体来说,

which(holidays$DATE == as.Date(bottleneck_row$early_startTime) | 
                   holidays$DATE == as.Date(bottleneck_row$endTime) == TRUE)

让我们删除|的前半部分:

which(holidays$DATE == as.Date(bottleneck_row$endTime) == TRUE)
# ...
holidays$DATE == as.Date(bottleneck_row$endTime) == TRUE

与数学运算符(例如,+)和赋值(&lt;-)不同,== 不*级联:

TRUE == TRUE == TRUE
# Error: unexpected '==' in "TRUE == TRUE =="
(TRUE == TRUE) == TRUE
# [1] TRUE

所以一个字面上的修复应该是

holiday_match <- lapply(1:nrow(bottleneck2), function(x) {
  bottleneck_row <- bottleneck2[x,]
  holidays[which(holidays$DATE == as.Date(bottleneck_row$early_startTime) | 
                   holidays$DATE == as.Date(bottleneck_row$endTime)) == TRUE,]
})

但由于== TRUE 完全没有必要,因此可以简化为

holiday_match <- lapply(1:nrow(bottleneck2), function(x) {
  bottleneck_row <- bottleneck2[x,]
  holidays[which(holidays$DATE == as.Date(bottleneck_row$early_startTime) | 
                   holidays$DATE == as.Date(bottleneck_row$endTime)),]
})
holiday_match
# [[1]]
# [1] DATE   REASON
# <0 rows> (or 0-length row.names)
# [[2]]
# [1] DATE   REASON
# <0 rows> (or 0-length row.names)
# [[3]]
# [1] DATE   REASON
# <0 rows> (or 0-length row.names)

没有匹配项,因为您的示例数据集没有重叠。如果您使用我上面的“轻推”数据,那么

holiday_match <- lapply(1:nrow(bottleneck2mod), function(x) {
  bottleneck_row <- bottleneck2mod[x,]
  holidays[which(holidays$DATE == as.Date(bottleneck_row$early_startTime) | 
                   holidays$DATE == as.Date(bottleneck_row$endTime)),]
})

holiday_match
# [[1]]
# [1] DATE   REASON
# <0 rows> (or 0-length row.names)
# [[2]]
#          DATE        REASON
# 11 2018-03-30 Easter Travel
# [[3]]
#          DATE REASON
# 13 2018-04-01 Easter

【讨论】:

  • hm 这是“正确的”并最终解决了我想要做的事情。但是我想保持我的工作流程一致,因为我编写的这个循环在其他情况下也有效。我只是对为什么感到困惑以前工作的时候就不行了。
  • 这是您的错误和修复,尽管以这种方式处理数据肯定是反tidyverse,并且需要进一步的后处理步骤才能将其放入单个帧中。
  • 这太棒了,非常感谢。此外,您在倒数第二个块中仍然有 == TRUE,
  • 什么什么? 在哪里? ... errr,对 ... 是的,已修复。 :-)
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-28
相关资源
最近更新 更多