1. match.call
간혹 함수를 짜다보면 입력한 인수를 사용했는지 확인이 필요 할 때가 있습니다.
예를 들어, 데이터 프레임에서 특정 열의 Five-Number Summary($\min$, $q_1$, $m$, $q_3$, $\max$)를 해당 데이터 프레임의 이름과 함께 출력하는 함수를 아래와 같이 작성해보았습니다.
fivenum_col <- function(df, col){
cat("DataFrame :", df)
print(fivenum(df[[col]]))
}
fivenum_col(iris, "Sepal.Length")
결과는 에러가 발생하는데요!
왜냐하면, df를 출력하면 iris의 데이터프레임을 출력하기 때문에 문자열 출력 함수와 호환되지 않기 때문입니다.
이런 에러를 방지하기 위해서 match.call 함수를 사용하는데 인자와 입력된 글자를 호출하는 함수입니다.
fivenum_col <- function(df, col){
cl <- match.call()
df_name <- as.character(cl$df)
cat("DataFrame :", df_name,"\n")
print(fivenum(df[[col]]))
}
fivenum_col(iris, "Sepal.Length")
2. 익명함수(anonymous functions)
파이썬의 람다 함수처럼 익명 함수를 지원합니다. R에서는 "\(인자){함수내부..} "와 같이 작성할 수 있습니다.
# 동일함수1
myfun <- function(data){
data^2/sd(data)}
# 동일함수2 - 익명함수
f <- \(x){x^2/sd(x)}
myfun(1:10)
f(1:10)
다만 익명함수에 바로 값을 주면 함수를 리턴하는 이유로 원하는 값을 반환하지 않기에, 다른 객체로 받아서 값을 전달하든, ()로 감싸고 값을 전달해야합니다.
a <- \(x){x^2}(1:5)
# return function
a # \(x){x^2}(1:5)
# 방법1
(\(x){x^2})(1:5) # [1] 1 4 9 16 25
# 방법2
f <- \(x){x^2}
f(1:5) # [1] 1 4 9 16 25
익명함수는 map 함수와 같이 함수형 프로그래밍에 좀 더 적합하다고 생각합니다.
아래 예시는 붓꽃 데이터의 종(Speices)마다 데이터를 분할하고 Sepal.Length와 Petal.Length에 대해 회귀분석을 각각 진행해 결과를 보기 좋게 다듬었습니다.
iris |> group_split(Species) |>
map(\(species_df){lm(Sepal.Length ~ Petal.Length, data = species_df)}) |>
map(\(lm_result) tidy(lm_result)) |>
list_rbind()
'Data Science > Manipulation' 카테고리의 다른 글
[R] rlang으로 하는 동적 변수 참조와 환경(Environment) (4) | 2024.11.04 |
---|---|
[EDA] 상관계수 시각화 (Visualization of Correlation Coefficient) with R (0) | 2024.09.27 |
[R] slice함수 : 위치를 이용한 행 선택 (Subset rows using position) (2) | 2023.09.06 |
[Data Science With R] 16. 리스트열(List-column)을 이용한 모델 (0) | 2023.09.02 |
[R] all_of와 any_of를 사용한 변수 선택 (조건을 이용한 선택 추가) (1) | 2023.07.29 |