2017-10-26 2 views
0

없이 문자열 값에 연결 나는 다음과 같은 데이터가 있습니다R의 함수 내에서 값을 지정하고 따옴표

tdata <- structure(list(sno = list("koko012", "koko013", "koko014", "koko015", 
    "koko016", "koko017"), ko = c("DuunWaan", "ChoYo", "GyeongHaa", 
"JaeSeok", "HangJii", "CheonYuu"), en = c("Judge", "Flutting Flag", 
"Javelin of Sky", "Seat for Longevity", "Oar for visitor", "Milk of Sky" 
), zh = c("庫樓", "", "梗河", "帝席", "", "天乳"), connect = list(
    c("1", "68933", "71352"), c("1", "71075", "71075"), c("2", 
    "72105", "71284", "71284", "71053"), c("2", "70602", "69226", 
    "69226", "67480"), c("6", "69612", "70327", "70327", "70400", 
    "70400", "69389", "69389", "68707", "68707", "68498", "68498", 
    "69612"), c("1", "77516", "77516"))), .Names = c("sno", "ko", 
"en", "zh", "connect"), row.names = 12:17, class = "data.frame") 

이 나는 ​​발견 빈 zh 세포로 나에게 입력 값을 돕기 위해 함수를 작성하고 싶습니다를 ko 칸에서 일치합니다.

다음 코드는 작동하지 않는 것 같습니다.

u <- function(x, y){tdata$zh[grep(x, tdata$ko, ignore.case = T)] <- y} 
u("choyo", "加油") 

그러나 명령을 독립적으로 사용하면 정상적으로 작동합니다.

tdata$zh[grep("choyo", tdata$ko, ignore.case = T)] <- "加油" 

어디서 잘못 되었나요?

다른 '별'질문은 다음과 같습니다. 문자열에 대한 인용 부호없이 u() 함수를 사용할 수 있습니까?

+1

해들리 위컴의 [기능에 관한 책] (http://adv-r.had.co.nz/Functions.html)을 읽어보십시오. 그것은 당신이 찾고있는 "수정 장소에서"구현하는 [대체 기능] (http://adv-r.had.co.nz/Functions.html#replacement-functions)에 대한 섹션이 있습니다. –

답변

1

잘못하지 않았습니다. R은 당신이 기대하는 것처럼 인자에 의한 인수를 전달하지 않습니다 (실제로는 인수로서 데이터 프레임을 전달하지 않았기 때문에 그보다 약간 미묘합니다).

zh 열을 함수 본문에서 tdata으로 수정하면 실제로 tdata 사본이 수정됩니다.

당신과 함께이 문제를 해결할 수 :

u <- function(x, y){ 
    tdata$zh[grep(x, tdata$ko, ignore.case = T)] <- y 
    tdata 
} 
tdata <- u("choyo", "加油") 

기능 (tdata)의 몸에 두 번째 줄은 return 문에 해당합니다. 익숙한 경우 return(tdata) 대신이 수정 된 복사본을 반환 할 수 있습니다.

그러면 전역 환경에서 함수의 출력을 tdata에 할당합니다.

당신 "그런데"질문에 관해서

,이처럼 "deparse-대신"패턴을 사용할 수 있습니다

u_2 <- function(x, y){ 
    x <- deparse(substitute(x)) 
    y <- deparse(substitute(y)) 
    tdata$zh[grep(x, tdata$ko, ignore.case = T)] <- y 
    tdata 
} 
u_2(choyo, 加油) 
+0

'return' 문은 무엇을합니까? 하나의 변수 만 가진 함수를 전달할 때 사용하지 않는 이유는 무엇입니까? 예 :'p <- function (q) {tdata $ zh [grep (q, tdata $ ko, ignore.case = T)]} p ("choyo")' – Sati

+0

아, 이제 알겠습니다. 우리는 위의 예제에서'tdata '에서 아무것도 수정하지 않으므로'return' 문은 필요하지 않습니다. 함수에 얼마나 많은 변수가 있는지와 관련이 없습니다. – Sati

+1

'return()'문이 없으면 R 함수는 마지막으로 실행 된 표현식 (일반적으로 마지막 행)의 결과를 반환합니다. 그것은 인수의 수와 아무런 관련이 없습니다. –

1

또한, 함수에 그렇게 모든 매개 변수를 데이터 프레임을 전달할 수 있습니다 함수에 전달됩니다.

u <- function(dtf, x, y){ 
     dtf$zh[grep(x, dtf$ko, ignore.case = T)] <- y 
     return(dtf) 
} 
u(dtf = tdata, x = "choyo", y = "blabla") 
관련 문제