"Object not found" błąd z ddply wewnątrz funkcji

Chcę użyć ddply (), aby zastosować te same funkcje do różnych kolumn, które są kolejno nazywane; na przykład. a, b, c. Aby to zrobić, zamierzam wielokrotnie przekazywać nazwę kolumny jako ciąg znaków i użyć wartości eval (parsowanie (tekst = nazwa_kolumny)), aby funkcja mogła się do niej odwoływać. Wykorzystałem tę technikę z innej odpowiedzi. I to działa dobrze, dopóki nie wstawię ddply () wewnątrz innej funkcji. Oto przykładowy kod:

# Wymagane pakiety:
library(plyr)

myFunction <- function(x, y){
    NewColName = "a"
    z = ddply(x, y, summarize,
            Ave = mean(eval(parse(text=NewColName)), na.rm=TRUE)
    )
    return(z)
}

a = c(1,2,3,4)
b = c(0,0,1,1)
c = c(5,6,7,8)
df = data.frame(a,b,c)
sv = c("b")

#To działa.
ColName = "a"
ddply(df, sv, summarize,
        Ave = mean(eval(parse(text=ColName)), na.rm=TRUE)
)

#To nie działa
#Wyświetla się error: "Error in parse(text = NewColName) : object 'NewColName' not found"
myFunction(df,sv)

#Dane wyjściowe w obu przypadkach powinny wynosić
#  b Ave
#1 0 1.5
#2 1 3.5

Czy ktos mógłby wskazać mi gdzie popełniam błąd?

1 odpowiedź

Możesz to zrobić za pomocą kombinacji do.call i call, aby utworzyć wywołanie w środowisku, w którym NewColName jest nadal widoczny:

myFunction <- function(x,y){
NewColName <- "a"
z <- do.call("ddply",list(x, y, summarize, Ave = call("mean",as.symbol(NewColName),na.rm=TRUE)))
return(z)
}

myFunction(d.f,sv)
  b Ave
1 0 1.5
2 1 3.5

Twoja odpowiedź

Zaloguj się aby odpowiedzieć.

Operiada

Operiada to polskojęzyczne forum informatyczne działające na zasadzie pytań i odpowiedzi.

Obserwowane tagi

Zaloguj się aby obserwować tagi.