diff --git a/.jules/bolt.md b/.jules/bolt.md index 1abb238..56bbff4 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -1,3 +1,6 @@ ## 2024-07-04 - R 언어에서 루프 내 데이터 프레임 탐색 병목 최적화 **Learning:** R에서 루프를 돌면서 매번 데이터 프레임을 서브셋팅(subsetting)하는 작업은 복사 오버헤드로 인해 매우 느려질 수 있습니다. 특히 공통 문항 수가 많아질 경우 O(N^2)의 비효율을 초래합니다. **Action:** 루프 내에서 수행하던 데이터 프레임 조회를 루프 외부에서 한 번에 `as.character(unlist(...))`로 처리하는 벡터 연산으로 변경하여 타입 변환 없이 O(1) 수준으로 성능을 크게 향상시킬 수 있습니다. +## 2024-07-08 - R 언어에서 다중 패턴 제외 필터링 성능 최적화 +**Learning:** R에서 여러 `grep()` 결과를 `-c()`로 합쳐서 벡터의 원소를 제외하는 로직(`x[-c(grep(pattern1), grep(pattern2))]`)은 여러 번의 문자열 검색과 인덱스 배열 생성으로 인해 오버헤드가 발생하며, 매칭되는 패턴이 없을 경우 `integer(0)`을 반환하여 전체 벡터가 삭제되는 버그를 유발할 수 있습니다. +**Action:** 여러 `grep` 조건을 하나의 정규 표현식으로 묶어 `!grepl("^(pattern1|pattern2)", x)` 형태로 사용하는 것이 성능 면에서 유리하며, 결과가 없을 때의 안전성도 확보됩니다. diff --git a/R/aFIPC.R b/R/aFIPC.R index 2e5ac4a..83e0f76 100644 --- a/R/aFIPC.R +++ b/R/aFIPC.R @@ -603,15 +603,7 @@ autoFIPC <- # IPD estimation IPDParmNames <- OldScaleParms$name IPDParmNames <- IPDParmNames[!duplicated(IPDParmNames)] - IPDParmNames <- - IPDParmNames[ - -c( - grep("^MEAN", IPDParmNames), - grep("^COV", IPDParmNames), - grep("^ak", IPDParmNames), - grep("^d0$", IPDParmNames) - ) - ] + IPDParmNames <- IPDParmNames[!grepl("^(MEAN|COV|ak|d0$)", IPDParmNames)] IPDParmNames <- as.character(IPDParmNames) mirt::mirtCluster()