возможная неэлегантность записанного кода

Вопросы по статистическому пакету R. Не обязательно гео.
_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 07 ноя 2013, 18:51

Доброго времени суток.
Необходимо провести некоторые "манипуляции" с данными (далее полупсевдокод):

1. считать данные
y <- read.table("E:/R_yazik/proga/pip/dannie/pikir_1.txt", header=TRUE, dec=",") #читаем файл

Файл, вида:

Время H K1 K2 T1 U V R U TI
1 0:17:35.0 3000 56 1.7 7.1 7.4 290 69 8.49116 -1.39116
2 0:17:35.5 3000 56 1.7 7.1 7.4 290 69 8.49116 -1.39116
3 0:17:36.0 3000 56 1.7 7.1 7.4 290 69 8.49116 -1.39116
4 0:17:36.5 3000 56 1.7 7.1 7.1 293 69 8.33699 -1.23699
5 0:17:37.0 3000 56 1.7 5.7 6.4 293 69 7.97726 -2.27726
...

Код: Выделить всё

# kol_vo strok i stolbcov
kol_row <- nrow(y)
kol_col <- ncol(y)

H <- y[,2] # vektor znacheniy "H"

REZ__Hi_men_rav__Hi_1 = integer(kol_row) # результирующий вектор
2. произвести сравнение данных между собой в одном из столбцов, результат (0 или 1) записать в
результирующий вектор

Код: Выделить всё

...
i <- 2
while (i < kol_row-1)
{
  H_i_m1 = H[i-1]
  H_i       = H[i]
  H_i_p1  = H[i+1]

  if (H_i <= H_i_m1 & H_i >= H_i_p1)
  {
     REZ__Hi_men_rav__Hi_1[i] = 1
  }
  else  
    {
      REZ__Hi_men_rav__Hi_1[i] = 0
    }
  i = i + 1
}
...
Сам я программист и использовал "привычные конструкции" (для меня), можно ли это сделать более "элегантно"?
Все работает, но выглядит довольно громоздко. (Работаю с R недавно).
Последний раз редактировалось _Vitaliy_ 09 ноя 2013, 19:13, всего редактировалось 2 раза.

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: возможная неэлегантность записанного кода

Сообщение gamm » 07 ноя 2013, 20:20

_Vitaliy_ писал(а):Сам я программист и использовал "привычные конструкции" (для меня), можно ли это сделать более "элегантно"?
Все работает, но выглядит довольно громоздко. (Работаю с R недавно).
в R нельзя писать циклы. Примите это как аксиому, если не верите, поковыряйте исходники (это интерпретатор со всеми вытекающими, плюс весьма своеобразной хранение данные). Все операции нужно векторизовать, для чего в R есть средства (описанные в 2000 страничном справочнике основных команд ядра, и это не считая разных пакетов). В этом случае вызывается код на С++ вместо интерпретации, и все работает быстро (примерно в 200 раз быстрее).

то, что вы хотите, делается примерно так:

Код: Выделить всё

cur.sel<-2:(nrow(y)-1)
H_i<-y[cur.sel,2]
H_i_p1<-y[cur.sel+1,2]
H_i_m1<-y[cur.sel-1,2]
REZ__Hi_men_rav__Hi_1<-as.integer(H_i <= H_i_m1 & H_i >= H_i_p1)

или так

cur.sel<-2:(nrow(y)-1)
REZ__Hi_men_rav__Hi_1<-as.integer((y[cur.sel,2] <= y[cur.sel-1,2]) & (y[cur.sel,2] >= y[cur.sel+1,2]))
тут еще важно отличать векторную "&" от скалярной "&&", у вас должна быть скалярная (хотя работать будет, когда один элемент). И лучше везде ставить скобки, поскольку приоритет операций иногда не очевиден, попробуйте вывести

Код: Выделить всё

n<-10
print(1:n-1)

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: возможная неэлегантность записанного кода

Сообщение Максим Дубинин » 08 ноя 2013, 14:24

ну и используйте

Код: Выделить всё

 здесь раз уж вы
[quote="_Vitaliy_"]Сам я программист[/quote]
пристегивайтесь, турбулентность прямо по курсу

_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

Re: возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 08 ноя 2013, 19:10

ну и используйте здесь раз уж вы
Благодарю что напомнили.
gamm, спасибо Вам за оперативность ответа, почти получилось.
Не вышло (у меня) следующее:
При задании интервала просмотра

Код: Выделить всё

cur.sel<-2:(nrow(y)-1) 
мы отрезаем от начала и конца по одному значению и результирующий вектор

Код: Выделить всё

REZ__Hi_men_rav__Hi_1
становится меньшим на 2 единицы.
Далее по коду я планирую создать через

Код: Выделить всё

data.frame
результирующую таблицу используя

Код: Выделить всё

H <- y[,2] # vektor znacheniy "H"
REZ__Hi_men_rav__Hi_1
а они отличаются по длине...

З.Ы. Еще вопрос, можно ли в отдельном скрипте описать функции, а вызывать их из другого скрипта, если да, то каким образом? (в просмотренной мной документации пока ответа не нашел)

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: возможная неэлегантность записанного кода

Сообщение gamm » 08 ноя 2013, 19:41

Максим Дубинин писал(а):ну и используйте

Код: Выделить всё

 здесь раз уж вы
[quote="_Vitaliy_"]Сам я программист[/quote][/quote]я бы поставил на студента 1 курса ...

_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

Re: возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 08 ноя 2013, 19:49

вот так всегда..., ("холивар")

_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

Re: возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 08 ноя 2013, 20:36

gamm писал(а):
Максим Дубинин писал(а):ну и используйте

Код: Выделить всё

 здесь раз уж вы
[quote="_Vitaliy_"]Сам я программист[/quote][/quote]я бы поставил на студента 1 курса ...[/quote]
Прошу не судить строго, недоразобрался.
Хочу "апнуть" свой вопрос, особенно насчет вопроса об взаимном использовании нескольких скриптов, можно даже просто линк.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: возможная неэлегантность записанного кода

Сообщение Максим Дубинин » 08 ноя 2013, 21:04

Код: Выделить всё

source("script.R")
или более хитро

Код: Выделить всё

if(!exists(foo, mode="function")) source("script.R")
пристегивайтесь, турбулентность прямо по курсу

_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

Re: возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 08 ноя 2013, 21:42

Спасибо, не знал что будет ТАК просто. Отвечу сам себе (с Вашей подсказкой), может кому пригодится:
имеем первый скрипт (2_scripta_2.R)

Код: Выделить всё

ff = function(arg)
{
  x = arg*arg
  return(x)
}

aa = ff(5)
aa # 25
имеем второй (основной) скрипт (2_scripta_1.R)

Код: Выделить всё

source("2_sripta_2.R")
bb = ff(4)
bb # 16
и все работает, тем более приятно, что функция ff появилась в списке через "Tab".
Оффтоп 1. Чем больше узнаешь возможности, тем больше начинает нравится язык.
Оффтоп 2. Почему раньше не узнал про R и мучался с Экселем и его "быстрым" вижуал бейсиком...

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: возможная неэлегантность записанного кода

Сообщение gamm » 09 ноя 2013, 07:28

пара замечаний по особенностям R

1) в функциях видно аргументы и глобальные переменные только на чтение, присваивать им нельзя (точнее, можно, но эффекта не будет). Если хочется, то читаем про assign() и environment()

Код: Выделить всё

x1<-10; x2<-20; x3<-30;
my.fun<-function(arg1) {
  x1<-x1+1;
  arg1<-arg1+1;
  assign("x3", x3+1, envir = .GlobalEnv) 
  print(sprintf("Inside my.fun: x1=%.0f, x2=%.0f, x3=%.0f",x1,x2,x3))
  invisible (NULL)
}
my.fun(x2)
print(sprintf("Outside my.fun: x1=%.0f, x2=%.0f, x3=%.0f",x1,x2,x3))
2) если в программе определено имя, совпадающее с именем, используемым системой, могут быть проблемы. Например, переменные T и F "перекроют" сокращенную запись для TRUE и FALSE, и будут проблемы с теми функциями (системными и в пакетах), которые используют сокращенную запись. Ошибки будут самые неожиданные, и непонятные - вчера все работало, сегодня перестало.

К своим именам переменных (и особенно функций) лучше приделывать префикс, типа

Код: Выделить всё

my.foo<-function(x) { invisible(x+1); }
my.foo(1)
print(my.foo(1))

_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

Re: возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 09 ноя 2013, 08:57

Спасибо, за пояснения, еще один вопрос, Вы упомянули в первом ответе про возможность использования кода, написанного на С++ в R, как это реализовать? (я нашел только возможность использования R в С++ (Rcpp))

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: возможная неэлегантность записанного кода

Сообщение gamm » 09 ноя 2013, 10:29

_Vitaliy_ писал(а):Спасибо, за пояснения, еще один вопрос, Вы упомянули в первом ответе про возможность использования кода, написанного на С++ в R, как это реализовать? (я нашел только возможность использования R в С++ (Rcpp))
странный вопрос для программиста ... все на официальном сайте, toolkit соответствующий есть.

_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

Re: возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 09 ноя 2013, 16:10

В принципе ничего странного не вижу, занимаюсь изучением R всего несколько дней за это время освоил базовый функционал в рамках своей задачи, появляются новые вопросы я их озвучиваю (у гугля я первого спрашиваю)+ на этом форуме ответы довольно оперативны, тем более славяноговорящих форумов практически нет, куча блогов это да. Поэтому и спрашиваю, другое дело если бы у меня было 500 сообщений и карма -- 100500 (без сарказма).
Пока нашел следующее:
http://cran.r-project.org/doc/manuals/r ... interfaces, если ткнете линком буду признателен

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: возможная неэлегантность записанного кода

Сообщение gamm » 09 ноя 2013, 17:40

_Vitaliy_ писал(а):В принципе ничего странного не вижу, занимаюсь изучением R всего несколько дней
R здесь совершенно ни причем. Гугля дает 21 миллион ссылок, вот первые две тыц, тыц.

_Vitaliy_
Новоприбывший
Сообщения: 13
Зарегистрирован: 07 ноя 2013, 18:38
Репутация: 0

Re: возможная неэлегантность записанного кода

Сообщение _Vitaliy_ » 09 ноя 2013, 19:12

Мы наверное недопоняли друг друга, я думал что может быть возможно использование кусков кода С++ в скриптах R (как пример ассемблерные вставки в с++), как R использовать в С++ я нашел, в сторону создания пакетов я даже и не смотрел. Но все равно спасибо, закладки сделал на будущее.

P.S. В принципе тему можно закрывать, единственное в теме не один а несколько подвопросов, поэтому может модератор подскажет, надо ли разделить на ветки (или вообще удалить)?

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 21 гость