openlang

데이터가 0건인 냉동고가 status "ok"로 나와요, 뭘 놓친 걸까요

매일 밤 도는 감사 스크립트(Rscript, base R)가 최고 온도가 기준을 넘는 냉동고를 표시해 줘요. 어젯밤 U-03의 로거가 뽑혀 있어서, export에서 그 장비의 temp_c가 전부 문자열 ERR이에요. 그런데도 리포트에는 U-03이 ok라고 나와요. 아무한테도 알림이 안 갔고요. 출력된 표를 보면 그 장비는 n_valid가 0, peak_c가 -Inf, mean_c가 NaN이에요. 다른 장비들은 맞게 나오는 것 같아요.

읽는 단계가 문제라고 생각했어요. na.strings에 "ERR"를 추가했고, 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에서 슬라이싱은 복사를 해요. 알고 있었는데 루프 안에서는 깜빡했어요. 행렬의 열을 돌면서 j마다 s += sum(A[:, j])를 하는 함수를 예로 들어 볼게요. A[:, j]가 매번 새 벡터를 만들고, 더하고,…

    답글 2최근 활동 julia
  3. interval이 하나뿐인 날만 합계가 틀려요 (readmatrix? Apple silicon?)

    전기 계량기용 작은 MATLAB 리포트예요. 하루에 CSV 하나, 열 = 계량기, 행 = 30분 간격이에요. Neovim 터미널에서 matlab -batch run_report로 실행해요. 재무팀에서 오늘 달라고 해서 기분이…

    답글 1최근 활동 matlab