2015-07-29 12 views
9

I birleştirme ile bir R expression nesne oluşturmak düşünün:R'de ifade nesnelerini nasıl daraltır/birleştiririm?

x = c(expression({ 
     a + b 
     b + c 
     }), 
     expression({ 
     a + 1 
     b + 1 
     })) 

Bu uzunluk-2 ifadesi nesne ile sonuçlanır:

> x 
expression({ 
    a + b 
    b + c 
}, { 
    a + 1 
    b + 1 
}) 

nasıl tek bir ifadeye bu çökme/dönüştürmek?

expression({ 
    a + b 
    b + c 
    a + 1 
    b + 1 
}) 
+0

'deparse', middles birleştirin, yeniden '? Bu neredeyse orada: 'c_exp = fonksiyon (x1, x2) ayrıştırma (text = c (kafa (deparse (x1), -1), kuyruk (deparse (x2), -1))) – Gregor

+0

@ nongkrong' olarak. İfade (liste (x [[1]] [[2]], x [[2]] [[2]])) 'ümit verici görünüyor, ama içinde kaç satır olduğunu umursamayan genel bir çözüme ihtiyacım var bireysel ifadeler veya kaç ifadenin yer aldığı. Muhtemelen yaklaşımına dayanabilirim. – cboettig

+0

@cboettig - Güncellemenizde, ifadeyi değerlendirirken yalnızca "b + 1" sonucunu alacağınızın farkında mısınız? –

cevap

3
x = c(expression({ 
    a + b 
    b + c 
    }), 
    expression({ 
    a + 1 
    b + 1 
    })) 

collapsit = function(x) { 
    if(!all(sapply(x, class) == "{")) 
     stop("I can't collapse non-bracket expressions for you, dawg") 

    stuff = unlist(lapply(x[-1], function(y) as.list(y[-1]))) 
    x[[1]][length(x[[1]])+1:length(stuff)] = stuff 
    x[1] 
} 

res = collapsit(x) 
## expression({ 
##  a + b 
##  b + c 
##  a + 1 
##  b + 1 
## }) 
2

Bu istenen sonuçları üretir ve muhtemelen reduce veya daha girdi almaya kadar ölçekli olabilir: Yani ben bu yaptıktan eşdeğer almak için x gerçekleştirebileceğiniz bir operasyon arıyorum olduğunu bloklarýnýn. Bu, bir çözümün iyi iyi olduğundan emin değilim, çünkü bu genellikle ifadelerden yararlanmıyorum.

c_exp = function(x1, x2) { 
    parse(text = c("{", 
        tail(head(deparse(x1), -1), -1), 
        head(tail(deparse(x2), -1), -1), 
        "}")) 
} 

x1 = expression({a+b}) 
x2 = expression({a + 1}) 
c_exp(x1, x2) 
# expression({ 
#  a + b 
#  a + 1 
# }) 
4
Bu iş gibi görünüyor

, her ifadesi Bu x + y ifadesinde olduğu gibi parantez içinde olmak üzere her ifadeyi gerektirmez {

as.expression(sapply(x, function(y) as.list(y[-1]))) 
# expression(a + b, b + c, a + 1, b + 1) 
+0

Güzel! Bunu daha önce “sapsız” yerine “lapply” ile denedim ve pes ettim. @hadley, http://adv-r.had.co.nz/Expressions.html dosyasındaki 'y [-1] ile yalnızca' call' kelimesine indiğinden bahseder, ancak sonuç listelerini daraltamam. güzel iş – cboettig

+0

ancak bu, 4 uzunluğunun bir ifadesini verirken, istenen çıktı bir ifadeye çökmek oldu, doğru mu? eğer bunu 'x' örneğimle denerseniz, son ifadeyi dağıtır ve x + y 'yi 'x' ve' y' olarak böler ve 6 – rawr

+0

@rawr yea uzunluğunu verir. alt ifadeler '{' ile başlamalıdır, son ifadeyi – jenesaisquoi

3

ile başlamalıdır:

x = c(expression({ 
    a + b 
    b + c 
    }), 
expression({ 
    a + 1 
    b + 1 
    }), 
expression(x + y)) 

# expression({ 
# a + b 
# b + c 
# }, { 
# a + 1 
# b + 1 
# }, x + y) 

s <- strsplit(paste0(as.character(x), collapse = ''), '[\n{}]')[[1]] 
x <- paste0(Filter(nzchar, gsub('^\\s+|\\s+$','', s)), collapse = '\n') 
parse(text = sprintf('{\n%s\n}', x)) 

# expression({ 
# a + b 
# b + c 
# a + 1 
# b + 1 
# x + y 
# }) 
+0

Bu bir çözüm! Bu benim için fatura uyuyor, ancak direk manipülasyonu (ki bu beni sinirlendirir) başvurmadan yapabiliyor gibi görünüyor; Örneğin. 'call' nesnesiyle http://adv-r.had.co.nz/Expressions.html ancak nasıl olduğunu göremiyorum. – cboettig

İlgili konular