2017-09-10 1 views
1

Ich versuche Funktionsargument zu verteilen, um tidyr :: Spread (Version tidyr_0.6), wie im folgenden Beispiel dargestellt. Mein Funktionsargument ist eine Zeichenfolge (Variablenname). Ich habe eine Fehlermeldung erhalten. Weiß jemand warum? Wie kann ich meinen Code ändern, damit er funktioniert?Pass Funktionsargument zu Tidyr :: Spread

# data 
stocks <- data.frame(
    time = as.Date('2009-01-01') + 0:9, 
    X = rnorm(10, 0, 1), 
    Y = rnorm(10, 0, 2), 
    Z = rnorm(10, 0, 4) 
) 
stocksm <- stocks %>% gather(stock, price, -time) 

#function 
spread.data <- function (var){ 
    var = sym(var) 
    stocksm %>% spread(stock, !!var) 
} 

spread.data('price') 

Ich habe eine Fehlermeldung erhalten.

Error: Invalid column specification 
+0

ich den Fehler nicht reproduzieren kann. Dein Code hat für mich funktioniert. Ich habe jedoch 'rlang :: sym 'angegeben. Hatten Sie ein anderes geladenes Paket mit einem ähnlichen Funktionsnamen? –

+0

@zesla hat auch für mich gearbeitet! Obwohl ich verwirrt bin, was "!!" (doppelte Verneinung) vor Var bedeutet? –

+0

@AkarshJain, einige Beispiele mit '' '' 'mit dplyr finden Sie unter http://dplyr.tidyverse.org/articles/programming.html#programming-recipes. – markdly

Antwort

1

Ich denke, der Kommentar von @ Z.lin richtig sein könnte. Hier ist ein reproduzierbares Beispiel, das rlang::sym Funktion verwendet. Beachten Sie, dass ein identisches Ergebnis erreicht werden kann, ohne die Funktion sym überhaupt zu verwenden. Früher habe ich tidyr_0.7.0 dieses Ergebnis zu erhalten:

suppressPackageStartupMessages(library(tidyverse)) 
suppressPackageStartupMessages(library(rlang)) 

# data 
stocks <- data.frame(
    time = as.Date('2009-01-01') + 0:9, 
    X = rnorm(10, 0, 1), 
    Y = rnorm(10, 0, 2), 
    Z = rnorm(10, 0, 4) 
) 
stocksm <- stocks %>% gather(stock, price, -time) 

# with rlang::sym function 
spread.data <- function (var){ 
    var = sym(var) 
    stocksm %>% spread(stock, !!var) 
} 

result1 <- spread.data('price') 

# without sym function 
spread.data <- function (var){ 
    stocksm %>% spread(stock, !!var) 
} 

result2 <- spread.data('price') 

identical(result1, result2) 
#> [1] TRUE 
+0

vielen Dank für den Info-Link. :) (Y) –

+0

@markdly Vielen Dank. Ich habe herausgefunden, was das Problem ist. (Nicht tippen) Ich benutze tidyr_0.6, was mit ordreverse kommt. tidyr_0.7 funktioniert für mich. – zesla

Verwandte Themen