2012-03-16 22 views
6

Tôi đang cố gắng xây dựng các biểu thức trong R bằng cách ghép các biểu thức nhỏ hơn. Ví dụ trong S + tôi có thể làm điều này:Làm thế nào tôi có thể ghép các đối tượng ngôn ngữ ghép trong R?

> x = substitute({a;b;c}) 
> y = substitute({d;e;f}) 
> c(x,y) 
{ 
    a 
    b 
    c 
    d 
    e 
    f 
} 

nhưng nếu tôi thử nó trong R, tôi có được điều này:

> c(x,y) 
[[1]] 
{ 
    a 
    b 
    c 
} 

[[2]] 
{ 
    d 
    e 
    f 
} 

Tôi có nên làm điều này một cách khác?

+0

Có. .................. –

+0

Tôi nghĩ bạn không may mắn ở đây Mike. –

Trả lời

7

Các nhận xét gắn liền với câu trả lời @ baptiste làm cho điểm xy không phải là đối tượng thuộc loại "expression" (một trong chín loại vectơ cơ bản được R) sử dụng. Do đó, chúng không thể kết hợp bằng cách sử dụng c(), vì chúng có thể nếu chúng thực tế là các vectơ expression.

Nếu bạn thực sự muốn kết hợp đối tượng của lớp "{" (được gọi là "đối tượng ngôn ngữ hợp chất" trong this section của Definition R Language) bạn có thể làm một cái gì đó như thế này:

x <- substitute({a;b;c}) 
y <- substitute({d;e;f}) 
class(x) 
# [1] "{" 

as.call(c(as.symbol("{"), c(as.list(x)[-1], as.list(y)[-1]))) 
{ 
    a 
    b 
    c 
    d 
    e 
    f 
} 

Sau đó, nếu bạn sẽ thực hiện việc này thường xuyên, bạn có thể tạo một hàm kết hợp một bộ đối tượng tùy ý của lớp "{":

myC <- function(...) { 
    ll <- list(...) 
    ll <- lapply(ll, function(X) as.list(X)[-1]) 
    ll <- do.call("c", ll) 
    as.call(c(as.symbol("{"), ll)) 
} 

# Try it out 
myC(x, y, y, y, x) 
+0

Làm việc như một sự quyến rũ! –

0

Tôi nghĩ một cách là lấy các thành phần của xy. Nó sẽ luôn luôn là trường hợp mà x[1] là "{}", vì vậy bạn có thể làm:

x[(length(x)+1):(length(x)+length(y)-1)] <- y[2:(length(y))] 

Mặc dù tôi tưởng tượng có một cách rõ ràng hơn.

2

Bỏ qua ví dụ bạn đưa ra trong câu hỏi của bạn trong thời gian tới,

x = expression(a,b,c) 
y = expression(d,e,f) 
c(x,y) 

Bây giờ, những gì sắp xếp của các đối tượng bạn đang cố gắng để tiếp nhau?

+0

hmmm. Ngoài kiến ​​thức của tôi: là một đối tượng thuộc loại "biểu hiện" giống như một đối tượng kiểu "ngôn ngữ"? –

+0

Có điều gì đó trong R/S được gọi là "biểu thức" là một chương trình chưa được đánh giá. Về cơ bản nó là một danh sách (như trong Lisp). Tôi muốn lấy hai cái ngắn và kết hợp chúng thành một cái dài. Trong Lisp nó sẽ được gọi là '(conc x y)'. Tôi không thể tìm thấy hàm đúng để thực hiện nó trong R. –

+1

@CarlWitthoft '?" Language-class "' dường như chỉ ra rằng '{a; b; c}' giống như 'call', ngoại trừ nó không có 'hàm' đúng. Các phần tử của nó có thể được truy cập với 'sapply (seq.int (length (x) -1), languageEl, object = x)'. Vì vậy, trong sự hiểu biết yếu ớt của tôi, 'expression' mở rộng' call', mở rộng 'ngôn ngữ'. Vì vậy, 'languageEl (biểu thức (a, b, c), 2)' cũng hoạt động. – baptiste

Các vấn đề liên quan