R 프로그래밍 중에 "target of assignment expands to non-language object" error 메시지가 발생하면 assign() 함수를 사용하여 문제를 해결할 수 있습니다.

 

"target of assignment expands to non-language object" error 가 발생하는 이유는 할당하려는 목표 객체(Target object) 를 R이 인식하지 못해 NULL 값으로 처리되어 있는 상태이기 때문입니다. 

 

아래에 이런 에러가 발생하는 간단한 예와 해결 방법을 소개해보겠습니다.

 

 

x변수는 1부터 30까지의 정수, y변수는 1부터 5까지의 정수이고, 이 두변수를 묶어서 xy라는 데이터 프레임을 만들어보겠습니다.

 

 

> x <- c(1:30) >

> y <- c(1:5)
>
> xy <- data.frame(x, y)
>
> str(xy)
'data.frame':	30 obs. of  2 variables:
 $ x: int  1 2 3 4 5 6 7 8 9 10 ...
 $ y: int  1 2 3 4 5 1 2 3 4 5 ...
>
> xy
    x y
1   1 1
2   2 2
3   3 3
4   4 4
5   5 5
6   6 1
7   7 2
8   8 3
9   9 4
10 10 5
11 11 1
12 12 2
13 13 3
14 14 4
15 15 5
16 16 1
17 17 2
18 18 3
19 19 4
20 20 5
21 21 1
22 22 2
23 23 3
24 24 4
25 25 5
26 26 1
27 27 2
28 28 3
29 29 4
30 30 5

 

 

위에서 생성한 xy 데이터프레임을 가지고, y변수 1, 2, 3, 4, 5 를 포함한 행(row) 별로 각 각 개별 데이터 프레임을 Loop 를 사용해서 만들어보겠습니다.  아래 Loop program에서 목표 객체(Target object)에 paste() 함수를 사용해서 공통 접두사(predix)로 'xy_'를 사용하고 뒤에 'i'로 loop 를 돌면서 1, 2, 3, 4, 5 를 붙여주려고 프로그램을 짰습니다만, "target of assignment expands to non-language object" 라는 오류 메시지가 떴습니다.  아래 프로그램에 대해 R은 [ paste("xy_", i, sep="") ]부분을 NULL 값으로 인식하기 때문에 이런 오류가 발생하게 됩니다.

 

 

> for (i in 1:5) {
+   paste("xy_", i, sep="") <- subset(xy, subset = (y == i))
+ }
Error in paste("xy_", i, sep = "") <- subset(xy, subset = (y == i)) : 
  target of assignment expands to non-language object

 

 

 

 

위 프로그램에서 하고자 했던 의도대로 R이 이해하고 실행을 하게끔 하려면 assign() 함수를 사용해야만 합니다.  assign() 함수를 사용할 때는 아래 처럼 '<-' 대신에 ',' 가 사용되었음에 주의하시기 바랍니다.

 

 
> for (i in 1:5) {
+   assign(paste("xy_", i, sep=""), subset(xy, subset = (y == i)))
+ }
>
> xy_1
    x y
1   1 1
6   6 1
11 11 1
16 16 1
21 21 1
26 26 1
>
> xy_2
    x y
2   2 2
7   7 2
12 12 2
17 17 2
22 22 2
27 27 2
>
> xy_3
    x y
3   3 3
8   8 3
13 13 3
18 18 3
23 23 3
28 28 3
>
> xy_4
    x y
4   4 4
9   9 4
14 14 4
19 19 4
24 24 4
29 29 4
>
> xy_5
    x y
5   5 5
10 10 5
15 15 5
20 20 5
25 25 5
30 30 5

 

 

많은 도움이 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 산낙지 2016.10.07 15:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요! 오늘도 포스팅 잘 보았습니다. 제가 본문을 참고해서 명령어를 실행해보았습니다. 그런데 문제가 발생해서 하나를 여쭙고 싶습니다.
    우선 저는 다음과 같은 명령어를 실행하고 싶은데요.

    pdt$birth1 <- c(1, 0, 0, 0, 0)[match(pdt$r_birth1, c(1, 2, 3, 4, 5))]
    pdt$birth2 <- c(1, 0, 0, 0, 0)[match(pdt$r_birth2, c(1, 2, 3, 4, 5))]
    pdt$birth3 <- c(1, 0, 0, 0, 0)[match(pdt$r_birth3, c(1, 2, 3, 4, 5))]

    그래서 assign을 이용해서 다음과 같은 명령어를 만들어 보았습니다.

    for (i in 1:3) {
    assign(paste("pdt$birth", i, sep=""), c(1, 0, 0, 0, 0)[match(paste("pdt$r_birth", i, sep=""), c(1, 2, 3, 4, 5))])
    }

    그런데 명령어가 오류 없이 실행은 되는데, pdt라는 객체에 birth1~3이 아예 안 생기더라고요.
    혹시 제 명령어에는 어떤 문제가 있는 건지 조언을 구할 수 있을까요? ㅠㅠ

    • R Friend R_Friend 2016.10.08 15:29 신고  댓글주소  수정/삭제

      산낙지님, 반갑습니다.

      assign() 함수 연습하는 용도라면요, birth1, birth2, birth3으로 개별 객체를 loop 연산으로 assign()으로 생성 후에 data.frame(cbind()) 하면 되겠네요.

      근데, 문의주신 형태의 output을 얻는데는 assign() 함수를 안쓰고 그냥 transform() 함수에 loop 돌리면 될거 같습니다.