как передать неизвестное количество аргументов функции в программировании на R

Я разбираю csv с несколькими столбцами. Количество столбцов в CSV-файле не фиксировано. Он варьируется от 5 до 10. Мне нужно воссоздать data.frame с этими столбцами внутри функции. Мне интересно, есть ли в R какие-либо функции с несколькими аргументами, как в Ruby (* args). Если нет, то как этого добиться ??? Я немного поискал и обнаружил, что если у меня есть имя столбца как

col1
col2

Я могу использовать:

list <- ls(pat="^col\\d$")

и передать этот список в качестве аргумента функции, но он будет передавать только имена столбцов в качестве символов, а не значения, которые несут эти имена столбцов.

Какие-либо предложения????

Изменить: я разбираю файл из приложения RoR и использую гем RinRuby для вызова функций R. Итак, синтаксический анализ csv из ruby ​​и передача содержимого отдельного столбца как одной переменной в R. Теперь в R мне нужно создать data.frame. Так что на самом деле это изначально не фрейм данных. Итак, в методе cal_norm ниже я назначаю переменные в R, используя цикл с именами col1, col2, col3 .... и так далее.

вот код рельсов:

 class UploadsController < ApplicationController

  attr_accessor :calib_data, :calib_data_transpose, :inten_data, :pr_list

  def index
    @uploads = Upload.all

    @upload = Upload.new

  respond_to do |format|
  format.html 
  format.json { render json: @uploads }   
  end
 end

 def create
  @upload = Upload.new(params[:upload]) 

 directory = "public/"
 io_calib = params[:upload][:calib]
 io_inten = params[:upload][:inten]   

 name_calib = io_calib.original_filename
 name_inten = io_inten.original_filename
 calib_path = File.join(directory, "calibs", name_calib)
 inten_path = File.join(directory, "intens", name_inten)

respond_to do |format|
  if @upload.save
    @calib_data, @calib_data_transpose = import(calib_path)
    @inten_data = import_ori(inten_path)
    #probe list of the uploaded file
    @probe_list = calib_data_transpose[0]
    logger.debug @probe_list.to_s
    flash[:notice] = "Files were successfully uploaded!!"
    format.html
    #format.js #{ render json: @upload, status: :created, location: @upload }
  else
    flash[:notice] = "Error in uploading!!"
    format.html { render action: "index" }
    format.json { render json: @upload.errors, status: :unprocessable_entity }
    end
  end
 end

def cal_norm
   #ajax request
   data = params['data'].split(',') 

  for i in 0..@calib_data_transpose.length - 1
  R.assign "col#{i}", @calib_data_transpose[i] 
  end

  R.assign "cells", @inten_data
  R.assign "pr", data
  R.eval <<-EOF

# make sure to convert them in character and numeric vectors

#match the selected pr in the table

#convert the found row of values from data.frame to numeric

#divide each column of the table by the respective pr values and create a new table repat it with different pr.

#make a new table with the ce count and different probe normalization and calculate  for individual pr

#finally return a data.frame with pr names and cell counts

#return individual columns as an array not in the form of matrix/data.frame

EOF

end

def import(file_path)
  array = import_ori(file_path)
  array_splitted = array.map {|a| a.split(",")} 
  array_transpose = array_splitted.transpose
  return array_splitted, array_transpose
end

 def import_ori(file_path)
  string = IO.read(file_path)
  array = string.split("\n")
  array.shift
  return array
 end

end

person JstRoRR    schedule 14.04.2014    source источник
comment
Я не понимаю вопроса. read.csv возвращает data.frame.   -  person Roland    schedule 14.04.2014
comment
И я нет. У вас есть один CSV-файл, содержащий от 5 до 10 элементов в каждой строке? Как вы собираетесь поместить это в прямоугольный фрейм данных? Вы можете дополнить его маркерами NA, используя параметр fill до read.csv. Иначе ... что?   -  person Spacedman    schedule 14.04.2014
comment
Просто прочтите свой CSV, используя read.csv или read.table. Обе функции не заботятся о том, сколько столбцов имеет ваш csv. Возможно, вы могли бы отредактировать свой вопрос, чтобы он был немного более ясным, например, в том, что именно вы имеете в виду, воссоздавая data.frame с этими столбцами.   -  person Stephan Kolassa    schedule 14.04.2014
comment
извините, я не упомянул одну вещь, я редактирую свой вопрос.   -  person JstRoRR    schedule 14.04.2014
comment
Вопрос отредактирован. Пожалуйста, проверьте нижние строки. Думаю, это было важно.   -  person JstRoRR    schedule 14.04.2014
comment
Вау .. голос против только за недостающую часть ... !!   -  person JstRoRR    schedule 14.04.2014
comment
Я думаю, вам нужно опубликовать пример того, что приходит от Ruby - иначе будет слишком сложно понять, что происходит   -  person John Paul    schedule 14.04.2014
comment
Джон, я добавил коды.   -  person JstRoRR    schedule 14.04.2014
comment
@JstRoRR Это полезно только для небольшого подмножества участников SO, которые знают и Ruby, и R. Разве вы не можете показать, что получает R? Например, вы передаете кучу векторов в цикле и хотите последовательно добавлять их в data.frame? cbind.data.frame может быть полезно. Может быть, поместите их все в список и используйте do.call(cbind.data.frame, listOfVectors).   -  person Roland    schedule 14.04.2014
comment
Роланд, это то, что у меня есть до сих пор ... люди здесь просили меня поместить полный код, поэтому я опубликовал, и поэтому сначала я просто абстрагировал вопрос, не обращая внимания на рельсы. Гошшх неваз.   -  person JstRoRR    schedule 14.04.2014
comment
Я упомянул в вопросе, в методе cal_norm я назначаю некоторые рубиновые переменные R. На самом деле то, что вы сказали, правильно, я хочу передать кучу векторов в цикле (цикл только для создания набора похожих имен переменных, отличающихся просто числом, например col1, col2 ...) и добавьте их в data.frame. Я попробовал do.call, но опять же, как R узнает количество переданных мной переменных. Думаю, мне нужно проверить RinRuby, могу ли я передать в R массив, а не просто переменные.   -  person JstRoRR    schedule 14.04.2014
comment
Роланд, я не могу создать listOfVectors, так как не знаю, сколько столбцов будет в файле. Это настоящая проблема, с которой я столкнулся ...   -  person JstRoRR    schedule 14.04.2014
comment
@JstRoRR, пожалуйста, посмотрите мой обновленный ответ.   -  person Silence Dogood    schedule 14.04.2014
comment
@JstRoRR, Кстати, в прошлом месяце у нашего рейса был экстренный случай, когда женщина пожаловалась, что ее 87-летний муж внезапно стал очень сонным, к счастью, у нас было мало врачей на борту, и они попытались разбудить его через 20 минут отсрочка и драма, к нашему крайнему удивлению, старик сказал, что я принял 2 снотворного, а жена с облегчением воскликнула: «Ты дурак!», почему ты не сказал мне об этом! Конец истории. Без обид, но детали очень важны: D   -  person Silence Dogood    schedule 14.04.2014
comment
@Vivek: спасибо за ответ ... думаю, ты мой любимый ангел, который, к счастью, знает Ruby и R ... кстати, я только что проверил RinRuby и могу передавать массивы в R из Ruby, а не только переменные. Поэтому я думаю, что итерация по объекту - это круто, поскольку мне не нужно беспокоиться о количестве столбцов в файле. Я попробовал, и это сработало. Но большое спасибо :)   -  person JstRoRR    schedule 14.04.2014
comment
@JstRoRR, спасибо за добрые слова. Это простая логика Ruby, что даже такой n00b, как я, может разобраться в этом, спасибо дизайнерам! и я рад, что вы нашли более элегантный способ, чем хакерское решение, которое мы изучали!   -  person Silence Dogood    schedule 14.04.2014
comment
@JstRoRR, не могли бы вы ответить на свой вопрос новым сообщением и закрыть его, чтобы он помог всем, кто сталкивается с той же проблемой   -  person Silence Dogood    schedule 14.04.2014


Ответы (1)


Опубликовать обновленный вопрос:

Я полный новичок в Ruby, но нашел здесь этот пример: цветные данные

Здесь данные по столбцам считываются в col_data, 0 - это индекс (col) (нет Ruby для тестирования :()

require 'csv'
col_data = []
CSV.foreach(filename) {|row| col_data << row[0]}

Назначьте данные col переменным col1 ... coln и создайте счетчик для количества столбцов (синтаксис может быть неправильным на 100%)

for i in 0..@calib_data_transpose.length - 1
 #R.assign "col#{i}", @calib_data_transpose[i] 
 CSV.foreach(filename) {|row| "col#{i}" << row[i]}
end

R.col_count=@calib_data_transpose.length - 1

И после создания col1..coln объедините данные столбца по одному индексу, начиная с i = 1. Результатом будет data.frame с порядком столбцов как col1 .... coln.

R.eval <<-EOF

for(i in 1:col_count) { 
  if (i==1) { 
   df<-data.frame(get(paste0("col",i))) 
  } 
  else { 
   df<-cbind(df,get(paste0("col",i))) 
 } 

 names(df)[i]<-paste0("col",i)
}

EOF

Сообщите нам, если это поможет ...


Больше не имеет отношения к обновленному вопросу, но сохранит его для потомков.

Подмножество data.frame для данного шаблона

Как заявил Роланд выше, read.csv будет читать весь файл, так как вы хотите контролировать, какие столбцы сохраняются в data.frame, вы можете сделать следующее:

Использование data(mtcars) в качестве образца data.frame

Код:

Прочтите данные:

> data(mtcars)
> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Подмножество данных для некоторого условия, скажем, столбцы, начинающиеся с алфавита 'c'

> head(mtcars[,grep("^c",colnames(mtcars))])
                   cyl carb
Mazda RX4           6    4
Mazda RX4 Wag       6    4
Datsun 710          4    1
Hornet 4 Drive      6    1
Hornet Sportabout   8    2
Valiant             6    1

Здесь '^c' похож на шаблон pat="^col\\d$" из вашего вопроса. Вы можете заменить '^c' любым регулярным выражением по вашему выбору, например '^col'. '^c' будет соответствовать любому шаблону, начинающемуся с алфавита 'c', чтобы соответствовать в конце строки, используйте '$c'

person Silence Dogood    schedule 14.04.2014
comment
Вивек, я свой вопрос редактировал. Извините, я пропустил эту важную часть - person JstRoRR; 14.04.2014