2017-08-24 1 views
0

Das sollte wirklich einfach sein. Ich versuche gerade eine Liste zu erstellen, die ich etwas effizienter erstelle. Statt zu schreiben, der mit:Mehrere Werte gleichzeitig in einer Liste setzen r

list('1'= value1, '2' =value1, '3' = value1) 

wie würde ich kondensieren diese in der Lage sein, einfach die Zahlen aufzulisten ich Wert1 gleich wollen. z.B. '1:4' =value1 oder '1,2,3,4' =value1

EDIT:

Also, für den Hintergrund, ich bin derzeit versucht, zum Erstellen eigene Formatierung für eine Excel-Datei, die das xlsx-Paket.

wb = createWorkbook() 
sheet =createSheet(wb,sheetName = "TestFormatting") 

dfcurrency = DataFormat("[$$-409]#,##0_ ;[Red]-[$$-409]#,##0 ") 
dfdate = DataFormat("m/d/yyyy") 

currency = CellStyle(wb, dataFormat = dfcurrency) 
date = CellStyle(wb, dataFormat = dfdate) 

datastyle = setNames(as.list(c(currency,date)),rep(c(3,4),c(1))) 

data = addDataFrame(table,sheet, colStyle = datastyle) 

Ist, was ich gerade laufe, dank der Hilfe von akrun. Dies gibt den Fehler:

Error in thisColStyle$ref : no field, method or inner class called 'ref' 

Und für den Fall ist es sinnvoll, hier ist die Datenstruktur der Tabelle:

structure(list(workingdate = structure(c(1458518400, 1458604800, 
1458691200, 1458777600, 1458864000, 1459119600), class = c("POSIXct", 
"POSIXt"), tzone = ""), trader = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("a", "b", "c", 
"d", "e"), class = "factor"), pnl.1d = c(3, 
-573.7978, -107.1941, 1128.3061, -0.709699999999998, 3.55990000000003 
), rt.1d.Util = c(0, -3.82531866666667e-05, -7.14627333333333e-06, 
7.52204066666667e-05, -4.73133333333332e-08, 2.37326666666669e-07 
)), .Names = c("workingdate", "trader", "pnl.1d", "rt.1d.Util" 
), row.names = c(NA, 6L), class = "data.frame") 
+0

Ich benutze xlsx .. – alex1stef2

Antwort

0

Hier ist eine sehr allgemeine Art und Weise ähnliche Dinge zu tun. Diese Lösung ist wahrscheinlich komplizierter als die beste Lösung, aber sie wird funktionieren und kann auf ähnliche Probleme erweitert werden. Es basiert auf eval und parse. parse wandelt einen String in einen nicht bewerteten Ausdruck um, eval wertet ihn aus.

So wird eval(parse(text="5+5")) zurückkehren 10.

Wenn wir den String "list('1'=value1, '2'=value1, '3'=value1)" erstellen können, können wir dann eval(parse(text= verwenden Sie es in die Liste machen Sie wollen.

Der folgende Code wird die obige Zeichenfolge erstellen:

value1 <- 'asdf' 
paste(
    'list(', paste(sapply(seq_len(4), 
       function(n) { paste("'", n,"'", "=", "value1", sep="")}), 
      collapse = ","), 
    ')') 

Also, alles kombiniert,

eval(parse(text= 
    paste(
     'list(', paste(sapply(seq_len(4), 
       function(n) { paste("'", n,"'", "=", "value1", sep="")}), 
      collapse = ","), 
     ')'))) 

nennen und Sie erhalten die Liste, die Sie wollen.

0

Dank Julians Kommentar konnte ich eine Lösung dafür erstellen. Ich werde Julian's Kommentar als Antwort akzeptieren, werde aber meine eigene (weniger allgemeine) Lösung als Beispiel geben. Grundsätzlich gilt seine Lösung, um mehr Anpassbarkeit in einem wenn auch sehr Umwegen zu schaffen:

#if no columns need a type of format enter 0 

a =paste(sapply(list(c(

    #enter column numbers formatted as currency eg. 1:5, 8, 10 

    3 

)), 
     function(n) { paste("'", n,"'", "=", "currency", sep="")})) 

b =paste(sapply(list(c(

    #columns formatted as date 

    1 

)), 
     function(n) { paste("'", n,"'", "=", "date", sep="")})) 

Sie können für so viele Variablen, die auf diese Weise mit dieser allgemeinen Formel fortsetzen, wie Sie mögen. Sie können sie dann in einem Text kombinieren bereit Datei analysiert werden:

text = paste('list(',paste(c(a,b,c,d), collapse = ","),')') 

datastyle = eval(parse(text = text)) 

, wo man einfach alle Formate und Stile in a, b, c, d, ...

Hoffentlich wird dies helfen, geben Sie jemand, der ein ähnliches Problem findet.

Verwandte Themen