2014-11-14 6 views
0

변수를 취하여 함수의 다른 문자와 연결하여 프레임의 다른 변수를 참조하는 함수를 만들고 싶습니다. 여기변수 이름을 가져 와서 변수를 내부적으로 연결하는 함수 R

set.seed(123) 
frame <- data.frame(x = rnorm(100), p01u = rnorm(100), p01o = rnorm(100)) 

sum.fun <- function(frame, var){ 
     xu <- cat(paste(var, "u", sep = "")) 
     xo <- cat(paste(var, "o", sep = "")) 
     print(sum(frame$xu)) 
     print(sum(frame$xo)) 
} 

sum.fun(frame, "p01") 

문제가 cat(paste())에 있지만 꽤 작동하는 클래스로 그것을 강요하는 방법을 알아낼 수 없습니다 예를 들어 (코드는 작동하지 않습니다). 모든 생각이 크게 감사드립니다.

+0

'cat' 함수는 항상 NULL을 반환합니다. 유일한 효과는 콘솔이나 파일에서의 부작용입니다. 도움말 페이지를 읽어보십시오. 또한'? '$''를 읽으면 문자 인수로 성공하지 못하기 때문에. –

답변

2

$은 문자 인수와 함께 작동하지 않으므로 cat 호출을 제거하고 [[을 사용하여 열을 가져올 수 있습니다.

sum.fun <- function(frame, var) { 
    xu <- paste0(var, "u") 
    xo <- paste0(var, "o") 
    setNames(c(sum(frame[[xu]]), sum(frame[[xo]])), c(xu, xo)) 
} 

sum.fun(frame, "p01") 
#  p01u  p01o 
# -10.75468 12.04651 

확인하려면

with(frame, c(sum(p01u), sum(p01o))) 
# [1] -10.75468 12.04651 

참고 : 당신이 함수에서 여러 출력을 원하는 경우에, 나는 그것이 출력에 대한 list을 사용하는 것이 가장 좋습니다 생각합니다. 이 방법으로 결과의 원하는대로 분류 된 문자 벡터와 숫자 벡터 벡터를 둘 다 가질 수 있습니다. 예 :

sum.fun2 <- function(frame, var){ 
    xu <- paste0(var, "u") 
    xo <- paste0(var, "o") 
    list(names = c(xu, xo), values = c(sum(frame[[xu]]), sum(frame[[xo]]))) 
} 

(sf2 <- sum.fun2(frame, "p01")) 
# $names 
# [1] "p01u" "p01o" 
# 
# $values 
# [1] -10.75468 12.04651 
sapply(sf2, class) 
#  names  values 
# "character" "numeric"