Object not found error with ddply inside function
To naprawdę podważyło moją zdolność do debugowania kodu R.
Chcę użyć funkcji
ddply (), aby zastosować te same funkcje do różnych kolumn z kolejnymi nazwami, takimi jak a, b, c. W tym celu zamierzam wielokrotnie przekazywać nazwę kolumny jako ciąg i używać
eval (parse (text = ColName)), aby umożliwić funkcji odwoływanie się do niej. Zaczerpnąłem tę technikę z innej odpowiedzi.
I działa dobrze, o ile nie wstawię
ddply ()wewnątrz innej funkcji. Oto przykładowy kod:
# Required packages:
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")#This works.
ColName = "a"
ddply(df, sv, summarize,
Ave = mean(eval(parse(text=ColName)), na.rm=TRUE))#This doesn't work
#Produces error: "Error in parse(text = NewColName) : object 'NewColName' not found"
myFunction(df,sv)#Output in both cases should be
# b Ave
#1 0 1.5
#2 1 3.5
Jakieś pomysły? NewColName jest nawet zdefiniowane wewnątrz funkcji!
Pomyślałem, że odpowiedź na to pytanie
loops-to-create-new-variables-in-ddply
https://coderoad.ru/5873922/, może mi pomóc, ale na dziś wycierpiałem już wystarczająco dużo i czas podnieść rękę i poprosić o pomoc.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
5 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
, dodane do plyr w grudniu 2012 r., odzwierciedla aktualny kontekst.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Oczywiście warto to zrobić „ręcznie”, ale często pozwala to uniknąć problemów związanych z punktacją, gdy łączysz i . Oczywiście nie oznacza to, że Hadley nie znajdzie rozwiązania ...
Anonimowy użytkownik
Potwierdzenie od:
Rozwiązanie @ Jamesa to bardzo fajne obejście,
<s>
ale jeśli dobrze pamiętam, sam @Hadley zwykł mawiać, że pakiet plyr nie jest przeznaczony do użycia w funkcjach.
</s>
Przepraszam pomyliłam się. Jednak obecnie wiadomo, że pakiet Plyr powoduje problemy w takich sytuacjach.
Podaję więc podstawowe rozwiązanie tego problemu:
Anonimowy użytkownik
Potwierdzenie od:
patrzy na parent.frame (1). Więc jeśli zamiast tego zdefiniujesz NewColName poza MyFunction, powinno to zadziałać:
Używając , aby pobrać my.parse z wcześniejszego środowiska, możemy być znacznie bliżej, ale nadal musimy przekazać curenv jako globalne:
Podejrzewam, że jest już oceniany w .GlobalEnv, więc wszystkie strategie i , które mam próby nie powiodły się.