Две проблемы: во-первых, with
ожидает одно выражение (которое выражается в data.frame или среде) в своем первом аргументе.Это можно исправить, заключив эти if
операторы в фигурные скобки, чтобы сделать его единым выражением.
test.2 <- function (num) {
x <- with(
{
if(num == 1){df.1}
if(num == 2){df.2}
if(num == 3){df.3}
},
sum(A)
)
return(x)
}
Вторая проблема заключается в том, что вы не возвращаетесь из выражения после того, как нашли совпадение.Таким образом, когда num
равно 1, первое условие удовлетворяется и возвращается df.1
.Но затем вычисляется следующее выражение if
, и поскольку num
не равно 2, возвращается NULL
.Точно так же третье выражение if
возвращает NULL
.Так как это последнее выражение в блоке, это то, что возвращается.У вас фактически есть
with(NULL, sum(A))
, что совпадает с простым sum(A)
, который выдает ошибку, потому что A
не существует.
Вы можете сделать другое исправление, например
test.2 <- function (num) {
x <- with(
{
if(num == 1)return(df.1)
if(num == 2)return(df.2)
if(num == 3)return(df.3)
},
sum(A)
)
return(x)
}
(это работает, когда num
равно 1, 2 или 3), но вам лучше использовать switch
вместо этого, как предлагает Джеймс.
Если все ваши фреймы данныхЕсли имя будет последовательно названо, как в примере, то есть даже лучшее решение, чем использование switch
.Используйте paste
, чтобы получить имя переменной, затем вызовите get
.
test.3 <- function(num) with(get(paste("df", num, sep = ".")), sum(A))
test.3(1) #6
test.3(2) #15
test.3(3) #24