2011-05-23 7 views
5

bana 'hangi' işlevin ne açıklayalım:C/C++ ile GNU-R arasında eşdeğer bir fonksiyon var mı()?

GNU-R yardımı itibaren

:

endeksleri DOĞRU

?

Dizge indisleri için izin veren mantıksal bir nesnenin "TRUE" dizinlerini verin.

ya da kodunu gösteren (GNU'ya R1 sayma endeksleri başlar)

> x <- c(1,2,3,1,3,5); 
> which(x == 1); 
[1] 1 4 
> which(x == 3); 
[1] 3 5 
> ll <- c(TRUE,FALSE,TRUE,NA,FALSE,FALSE,TRUE); 
> which(ll); 
[1] 1 3 7 

kimse C/C benzeri bir fonksiyon olduğunu mu ++? birlikte ben eklemek gerekir bir döngü ile -

+0

['std :: find_if'] (http://en.cppreference.com/w/cpp/algorithm/find) veya [' std :: copy_if'] (http://en.cppreference.com/ w/cpp/algoritma/kopyalama) ile ne yapmak istediğinize bağlı olarak. (Ya da diğer kütüphane çağrılarından herhangi biri) –

cevap

6

Sen R ilk C ise vektörleştirilmiş olduğunu anlamak zorunda ve en önemlisi bireysel atomistik veri parçaları üzerinde çalışır: Tek bir int, double ...

C ile

++, STL algoritmaları içine bakabilirsiniz hangi ile buna yaklaş.

Son olarak, R ve C++ kesişiminde, Rcpp paketimizde C++'da bazı işlemleri taklit eden bazı vektör işlemleri vardır; daha fazla (ve/veya Rcpp'deki görüşmelerimizden bazıları için) Rcpp-sugar pdf skeçine bakın.

+0

kesinlikle haklısınız. Yumruk yaklaşımım oldukça R merkezliydi. Sanırım C++ bakış açısı için denemek zorundayım. – rinni

2

hile yapmak gerekir algoritma std::find_if

rinni Yardımlarınız için

teşekkürler.

3

std::for_each'u kullanarak eşleşme değeri ve listenizdeki yineleyici ile başlatabileceğiniz bir functor nesnesi oluşturun. Örneğin Yani:

vector<int> values; 
//fill your vector with values; 

struct match_functor 
{ 
    vector<int> value_array; 
    int match_value; 

    match_functor(int value): match_value(value) {} 

    void operator() (int input_value) 
    { 
     if(match_value == input_value) 
      value_array.push_back(input_value); 
    } 
}; 

match_functor matches(1); 
std::for_each(values.begin(), values.end(), matches); 

Şimdi sonuç değeri dizisi matches.value_array[INDEX] kullanılarak erişilebilir.

struct match_functor 
{ 
    vector<int> index_array; 
    int match_value; 
    int index; 

    match_functor(int value): match_value(value), index(0) {} 

    void operator() (int input_value) 
    { 
     if(match_value == input_value) 
      index_array.push_back(index); 

     index++; 
    } 
}; 

match_functor matches(1); 
matches = std::for_each(values.begin(), values.end(), matches); 

Şimdi matches.index_array[INDEX] yapacak: basitçe yerine gerçek değerlerden daha özgün vektör indicies, sahip olmak istiyorsanız, o zaman funktoru nesnesi için böyle bir şey yapabileceği bir alternatif olarak

, orignal vektörünün değerleri 1 değeriyle eşleşir ve orijinal vektördeki gerçek değerler değildir.

+1

İlk kod snippet'iniz, 'std :: remove_copy_if' için daha karmaşık bir alternatiftir. –

+0

Bu, hiçbir değeri kaldırmıyor ... orijinal vektördeki sayıların sayısı için istenen değerin N katının bir kopyasını oluşturuyor. – Jason

+2

@Jason Evet, bu değerleri giriş vektöründen diğerine kopyalar, böylece bazı yüklemelere uymayan değerleri (kopyalama) kaldırır. Bu std :: remove_copy_if' nedir? –

İlgili konular