Передайте команды R и результаты из цикла for в файл - PullRequest
0 голосов
/ 13 января 2010

Мы хотим записать команды и результаты R-скрипта в файл текстового отчета. Канал в текстовый файл хорошо работает с sink(), но не внутри цикла for.

Скрипт вызывается с

source("myscript.r",echo=TRUE)

Нам нужен цикл для последовательного извлечения всех строк data.frame в вектор и проведения некоторого векторного анализа с каждым вектором. Вот краткий пример:

#pipe output to file
sink("myfile.txt",append=TRUE,split=TRUE)
#some data
c1<-rnorm(10,mean=90,sd=10) 
c2<-rnorm(10,mean=75,sd=8)
c3<-rnorm(10,mean=98,sd=12)
#data in a data.frame
cData<-data.frame(c1,c2,c3)
#print data.frame
cData  
#loop over frame 
for (i in 1:ncol(cData))  
{
  #extract vector
  x<-cData[,i]
  #do something with vector
  n = length(x)
  #... more code
  #print result
  print(n)    
}
#close output
sink()

Я пробовал это с sink() и txtStart(), но sink() усекает команды и помещает результаты после цикла, txtStart(), кажется, повторяет команды, но не результаты.

Я также посмотрел на brew, но мне просто нужен текстовый файл, ничего не отформатированный.

Ответы [ 3 ]

2 голосов
/ 13 января 2010

Я бы порекомендовал не думать с точки зрения

source("myscript.r",echo=TRUE)

а скорее в терминах Rscript (который идет с R)

Rscript myscript.r     # on windows, linux or os x

или в пересчете на littler

r myscript.r           # on linux or os x

Это дает вам возможность запрашивать параметры командной строки (через пакеты CRAN getopt и optparse) и многое другое.

0 голосов
/ 15 января 2010

Несколько мыслей:

Результаты, полученные после цикла, являются стандартным способом для R обеспечить вывод & ndash; это потому, что R не выполняет цикл, пока выражение не будет завершено. Это не проблема, специфичная для sink. Чтобы увидеть это, выполните весь ваш фрагмент кода, кроме команд sink (поэтому выходные данные отправляются на консоль R), и вы увидите тот же эффект. Для ясности вы можете добавить строку типа

cat("Results for iteration", i, "\n")

в начале цикла for.


Как указал Джуба, вам не нужен цикл for в этом случае - ndash; Либо векторизация, либо apply будет лучше.


Стандартный способ объединения кода и вывода в некоторую форму отчета в R заключается в использовании Sweave. Это создаст латексную разметку, которую вы можете затем скомпилировать в документ PDF или PostScript (с минимальными усилиями, когда у вас будут настроены некоторые инструменты латекса). Очевидным преимуществом этого является то, что вы также можете включать цифры.


РЕДАКТИРОВАТЬ: Существует также пакет brew для смешанного текстового и кодового отчета.

0 голосов
/ 13 января 2010

Я не совсем понимаю, что именно вы хотите, в частности, почему вы хотите поместить исходный код в ваш текстовый файл.

Во-первых, мне лучше использовать * семейство функций apply для просмотра кадра данных вместо цикла for, особенно lapply и sapply.

С помощью следующего кода вы получите три разных представления вашего вывода. Первый должен быть похож на то, что вы получаете с вашим кодом. Второй и третий немного отличаются, они выводят значения в виде списка или фрейма данных.

sink("/tmp/myfile.txt", append=TRUE, split=TRUE)

myfunc <- function(v) {
  variance <- var(v)
  mean <- mean(v)
  return(list(variance=variance,mean=mean))
}

myotherfunc <- function(v) {
  cat("And the mean is:\n")
  print(mean(v))
  cat("And the variance is:\n")
  print(var(v))
}

# results printed directly
invisible(lapply(cData, myotherfunc))

# results as a list
lapply(cData, myfunc)

# results as a data frame
sapply(cData, myfunc)


sink()

Во всяком случае, я не знаю, может ли один из этих выходов быть тем, что вы ищете.

...