2017-12-18 24 views
0

코드를보다 깨끗하게 유지 보수하기를 원합니다. 특히 수 목록> (100), 이것은이 5 개 요소 목록을 만들기위한 많은 반복이동적으로 변수 이름을 만들고 R 코드를 반복하지 않도록 함수에 동적으로 할당하는 방법은 무엇입니까?

var <- "temperature" 
quantsList <- list(
    q05 <- paste0('quantile(',var,', probs=.05, na.rm = TRUE)') 
    q10 <- paste0('quantile(',var,', probs=.10, na.rm = TRUE)') 
    q25 <- paste0('quantile(',var,', probs=.25, na.rm = TRUE)') 
    q50 <- paste0('quantile(',var,', probs=.50, na.rm = TRUE)') 
    q75 <- paste0('quantile(',var,', probs=.75, na.rm = TRUE)') 
    q80 <- paste0('quantile(',var,', probs=.80, na.rm = TRUE)') 
    q90 <- paste0('quantile(',var,', probs=.80, na.rm = TRUE)') 
    q95 <- paste0('quantile(',var,', probs=.80, na.rm = TRUE)') 
) 

나는 나쁜 코딩 같은 종류를 방지하는 방법을 이해하려면 예를 들어, 다음 quantsList 목록을 집단. 내 검색 결과는 assign()으로 연결되며 get() 기능입니다. 그러나 나는 이것들을 적절하게 "사용"하는 법을 실제로 알 수는 없습니다. 지금은 내가 무엇을 : 그래서 quantList 이렇게

# Attempt to create the list "quants" with dynamically named elements storing dynamically created functions 

assignFuns <- function(q){ 
    quant = paste0("q",q) 
    assign(quant, paste0('quantile(',var,', probs=.',q,', na.rm = TRUE)')) 
    return(get(quant)) 
} 
quants <- list(05,10,25,50,75,80,90,95) 
quantsList <- lapply(quants, assignFuns) 

분위 기능을 저장하는 요소를 포함하지만, 목록 요소 이름이 있습니다.

나는 단순히 사용하여 목록의 요소 이름을 지정할 수 있습니다 알고

names(quantsFuns) <- lapply(quants, function(x) paste0("q",x)) 

그러나이 워크 플로는 나에게 너무 복잡한 것 같습니다 및 할당의 순간에 내 조합 얻을 쓸모가 없다. assign() 또는 get()을 더 효율적으로 사용해야합니다. 내 assignFuns() 함수를 적용하여 이름과 해당 함수를 모두 반환해야합니까, 아니면 완전히 다른 방식으로 진행해야합니까? 통찰력과이 문제

편집

그래서 @Roland에 따라, assign()을 방지하는 것입니다에 대한 저를 제공 할 수있는 도움을

감사합니다. 따라서이 코드를 사용하면됩니다.

assignFuns <- function(q){ 
    quantFun <- paste0('quantile(',var,', probs=.',q,', na.rm = TRUE)') 
    return(quantFun) 
} 
quants <- list(05,10,25,50,75,80,90,95) 
quantsFuns <- lapply(quants, assignFuns) 
names(quantsFuns) <- lapply(quants, function(x) paste0("q",x)) 
+1

기호를 별도로 지정하지 마십시오. 간단히 다음과 같이하면됩니다 :'prob <- c (0.05, 0.1, 0.25, .5, 0.75, 0.8, 0.8, 0.8); prob <- sub ("0.", ".", formatC (prob, 숫자 = 2, 형식 = "f"), 고정 = TRUE); paste0 ('quantile (', var, ', probs =', prob, ', na.rm = TRUE)') ' – Roland

+2

'assign'은 매우 진보 된 것들입니다. R 환경에서 일하는 전문가가 아니라면 결코 사용해서는 안됩니다. R을 사용한 지난 5 년 동안 제 자신의 작업에서'assign'을 합법적으로 사용하지 못했습니다. – Roland

+1

나는 또한 왜 당신이 R 명령을 텍스트로 작성 중입니다. 나는 당신이 그 (것)들을 평가하거나 분석하기 위하여 계획하지 않는다는 것을 희망한다. – Roland

답변

1

R이 작동하지 않습니다. 매크로 언어가 아닙니다. 그리고 당신은 정말로 지구 환경에서 많은 변수들을 생성하고 싶지 않습니다. 대신 명명 된 벡터 (또는 목록)를 만듭니다. quantile 함수는 quantiles의 벡터를 리턴하도록 설계되었습니다.

t_probs <- c(05,10,25,50,75,80,90,95)/100 
temp_quants <- quantile(temperature, probs=t_probs) 
# If you need them to be named then: 
names(temp_quants) <- paste0("Q_", t_probs)