2017-05-01 25 views
0

我有一個R代碼分爲多個腳本。代碼的結果取決於主腳本中包含的一些參數。該腳本不是太長(200行),但仍然不是讓參數分散在腳本中,而是將它們都放在一個很好的輸入文件中,這樣會更加整潔。問題是,雖然很容易將類似數據框的文件讀入R,即每列都有一種類型的文件,但我不確定如何讀取自由格式文件。的格式的類型是閱讀一個自由格式的輸入文件

var_1 contents of var_1 
var_2 contents of var_2 
. 
. 
. 

。例如:

db_filename "goofy.csv" 
exe_filename "cal_code.exe" 
calibration_parameters "Cd" "fn" "fm" 
tests "T1" "T2" "T4" "T9" 
test_type "V" 
speed 2310 
flow_rate 2.238 

的參數可以在一個固定的順序指定(使得db_filename總是在第一行中)。一個解決方案中,每個變量可以在任何行中,只要它只在ONE行中,只要這不會使文件讀取代碼變得複雜起來就更好。什麼是強制性的,格式必須是「免費」,其中「免費」我的意思是,我不希望被迫有變量(例如)始終在第10列(例如)。我也意味着非標量參數的長度必須是可變的:例如,calibration_parameterstests是矢量,如您所見。文件讀取代碼必須能夠處理3個校準參數4,5等。 最後,我使用空格分隔了此文件中的元素,但如果這樣可以簡化任務,我可以接受使用其他分隔符的解決方案。你能幫我讀一下這樣的文件嗎?

回答

1

如果你不介意使用冒號:

db_filename:"goofy.csv" 
exe_filename:"cal_code.exe" 
calibration_parameters:"Cd" "fn" "fm" 
tests:"T1" "T2" "T4" "T9" 
test_type:"V" 
speed : 2310 
flow_rate:2.238 

我覺得這樣的事情會爲你工作?

library(tidyverse) 
df = as_tibble(t(read.csv("playing-around.csv", header = FALSE, sep = ":", strip.white = TRUE) %>% tidyr::separate("V2", sep = " ", into = as.character(c(1:10))))) 
#I used 1:10, but just set it beyond your maximum option list size and this should work 
#move the first row to the column names 
colnames(df) <- as.character(unlist(df[1,])) 
df = tail(df, -1) 

然後,您可以訪問您的選項,即一個字符矢量集: options = na.omit(df$db_filename)

+0

我會在稍後嘗試一下代碼,但同時你能解釋''V2''字符串在'separate'表達式中的含義是什麼? – DeltaIV

+0

當您不指定col.names時,V2是來自'''read.csv'''的第二列的默認名稱。我們在由冒號定義的第二列上分開。 – rsmith54

+0

最後一行應該是'tail(df,-1)',而不是'head(df,-1)'。結果是公平的,但不是很好。每個結腸前後的空白數大大地改變了讀取操作的結果。例如,比較倒數第二行「速度:2310」和最後一行「flow_rate:2.238」。倒數第二行在名稱不是「速度」但是速度爲「\」(!!)的列中進行轉換,其前兩個元素爲空,而最後一行在名爲「flow_rate」的列中正確轉換,其第一個元素是「2.238」,它是唯一的空元素。當然,迫使[1/2] – DeltaIV