Давайте исследуем (см. Добавленные мной комментарии) исходную функцию и вызов, предполагая, что вы хотите передать имена интересующих вас столбцов в функцию:
myfun <- function (dataframe, varA, varB) {
#on this next line, you use A and B. But this should be what is
#passed in as varA and varB, no?
daf2 <- data.frame (A = dataframe$A*dataframe$B, B=dataframe$C*dataframe$D)
#so, as a correction, we need:
colnames(daf2)<-c(varA, varB)
#the first argument to lm is a formula. If you use it like this,
#it refers to columns with _names_ varA and varB, not as names
#the _contents_ of varA and varB!!
anv1 <- lm(varA ~ varB, daf2)
#so, what we really want, is to build a formula with the contents
#of varA and varB: we have to this by building up a character string:
frm<-paste(varA, varB, sep="~")
anv1 <- lm(formula(frm), daf2)
print(anova(anv1))
}
#here, you pass A and B, because you are used to being able to do that in a formula
#(like in lm). But in a formula, there is a great deal of work done to make that
#happen, that doesn't work for most of the rest of R, so you need to pass the names
#again as character strings:
myfun (dataframe = dataf, varA = A, varB = B)
#becomes:
myfun (dataframe = dataf, varA = "A", varB = "B")
Примечание: выше я оставил исходный код на месте, поэтому вам, возможно, придется удалить часть этого кода, чтобы избежать ошибок, которые вы изначально получали.Суть ваших проблем в том, что вы всегда должны передавать имена столбцов в виде символов и использовать их как таковые.Это одно из мест, где синтаксический сахар формул в R вводит людей в плохие привычки и недопонимание ...
Теперь, что касается альтернативы: единственное место, где фактически используются имена переменных, находится вформула.Таким образом, вы можете еще больше упростить ситуацию, если не возражаете против незначительных косметических различий в результатах, которые вы можете очистить позже: вам не нужно передавать имена столбцов !!
myfun <- function (dataframe) {
daf2 <- data.frame (A = dataframe$A*dataframe$B, B=dataframe$C*dataframe$D)
#now we know that columns A and B simply exist in data.frame daf2!!
anv1 <- lm(A ~ B, daf2)
print(anova(anv1))
}
В качестве последнего совета: я бы воздержался от вызова print в вашем последнем утверждении: если вы этого не сделаете, но используйте этот метод непосредственно из командной строки R, он все равно выполнит печать для вас.В качестве дополнительного преимущества вы можете выполнять дальнейшую работу с объектом, возвращаемым вашим методом.
Очищенная функция с пробной версией:
dataf <- data.frame (A= 1:10, B= 21:30, C= 51:60, D = 71:80)
myfun <- function (dataframe, varA, varB) {
frm<-paste(varA, varB, sep="~")
anv1 <- lm(formula(frm), dataframe)
anova(anv1)
}
myfun (dataframe = dataf, varA = "A", varB = "B")
myfun (dataframe = dataf, varA = "A", varB = "D")
myfun (dataframe = dataf, varA = "B", varB = "C")