openlang

冷柜读数为零却报告状态 "ok",我漏了什么

我的夜间审计脚本(Rscript,base R)会标出峰值温度超过上限的冰柜。昨晚 U-03 的记录仪被拔掉了,所以导出文件里它的 temp_c 全是字符串 ERR。报告里 U-03 仍然显示 ok。没有人收到告警。打印出来的表里,这台设备的 n_valid 是 0,peak_c 是 -Inf,mean_c 是 NaN。其他设备看起来都对。

我以为是读取这一步出了问题。我把 "ERR" 加进了 na.strings,确认了 temp_c 读进来是数值型,还用 --verbose 跑了一遍。行数是对的。没有任何变化。

相关部分如下。

readings <- read.csv(infile, stringsAsFactors = FALSE,
                     na.strings = c("", "NA", "ERR"))

peak_c = max(df$temp_c, na.rm = TRUE),
mean_c = round(mean(df$temp_c, na.rm = TRUE), 1)
...
res$status <- ifelse(res$peak_c > LIMIT_C, "ALARM", "ok")

LIMIT_C 是 -65。R 在运行快结束时还会打印一条警告。我的终端本来每次启动就会报 LC_CTYPE 的问题,所以我已经不看警告了。有一次,我的一个任务就带着这样的警告跑了一个月。

是读取这一步的问题,还是它后面的某一步?

从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    问题出在读取之后。对空向量用 max() 且 na.rm = TRUE 会得到 -Inf,而 -Inf > -65 是 FALSE,所以就成了 "ok"。这就是你不再看的那条警告。先检查 n_valid。

    res$status <- ifelse(res$n_valid == 0, "NO DATA",
                         ifelse(res$peak_c > LIMIT_C, "ALARM", "ok"))

    关于空输入的行为,见 ?max。

    从英语翻译查看原文

同一个问题的其他角度

  1. 把一小段 MATLAB 脚本移植到 R,结果有一个变成了矩阵

    大家好。我在把同事(Priyesh,2023 年写的)的一段简短 MATLAB 脚本移植到 R,因为我们流程里其余部分都是 R,而我基本没碰过 MATLAB。R 版本从头到尾能跑完,没有报错也没有警告,但数字和他保存的日志对不上。 核心部分如下,先放…

    回复 2最近活动 rmatlab
  2. 一个每次分配一列的循环

    Julia 里切片是会复制的,这我知道,结果在循环里又忘了。有个函数遍历矩阵的各列,对各列做 s += sum(A[:, j]),每个 j 一次。每个 A[:, j] 都会新建一个向量,求完和就扔掉。@time 显示分配量随列数增长,而性能提示里说,…

    回复 2最近活动 julia
  3. 只有一个时间间隔的那天合计不对(readmatrix?Apple silicon?)

    一个给电表用的小 MATLAB 报表,每天一个 CSV,列是电表,行是 30 分钟的间隔。在 Neovim 终端里用 matlab -batch run_report 运行。财务今天就要,所以我心情不太好。 2026-10-30 有 3 个间隔,数字…

    回复 1最近活动 matlab