Как присвоиться от функции, которая возвращает больше чем одно значение?

Вы пропустили запятую после первого URL () («home») в списке. Вы захотите:

url(r'^ 

Кроме того, если вы только учитесь, подумайте об использовании Django 2.1 с его упрощенным синтаксисом URL. Удачи!

, views.home, name='home'),

Кроме того, если вы только учитесь, подумайте об использовании Django 2.1 с его упрощенным синтаксисом URL. Удачи!

208
задан smci 29 October 2016 в 14:33
поделиться

5 ответов

С R 3.6.1, я могу сделать следующий

fr2v <- function() { c(5,3) }
a_b <- fr2v()
(a_b[[1]]) # prints "5"
(a_b[[2]]) # prints "3"
-1
ответ дан 23 November 2019 в 04:41
поделиться

Да на второй и третий вопросы - это то, что вам нужно сделать, поскольку у вас не может быть несколько «lvalues» слева от задания.

4
ответ дан 23 November 2019 в 04:41
поделиться

На этот вопрос нет правильного ответа. Я действительно зависит от того, что вы делаете с данными. В простом примере, приведенном выше, я настоятельно рекомендую:

  1. Делайте вещи как можно проще.
  2. По возможности, лучше всего держать ваши функции векторизованными. Это обеспечивает максимальную гибкость и скорость в долгосрочной перспективе.

Важно ли, чтобы значения 1 и 2, указанные выше, имели имена? Другими словами, почему в этом примере важно, чтобы 1 и 2 назывались a и b, а не просто r [1] и r [2]? В этом контексте важно понимать, что a и b также оба вектора длины 1. Таким образом, вы на самом деле ничего не меняете в процессе выполнения этого назначения, кроме двух новых векторов, которые не нужно ссылаться на индексы:

> names(r) <- c("a","b")
> names(r)
[1] "a" "b"
> r["a"]
a 
1 

[Edit] Учитывая, что вы будете применять min и max к каждому вектору отдельно, я бы предложил либо использовать матрицу (если a и b будут одинаковой длины и одного типа данных), либо фрейм данных (если a и b будут иметь одинаковую длину, но могут быть разными типами данных) или используйте список, как в вашем последнем примере (если они могут иметь разную длину и типы данных).

> r <- data.frame(a=1:4, b=5:8)
> r
  a b
1 1 5
2 2 6
3 3 7
4 4 8
> min(r$a)
[1] 1
> max(r$b)
[1] 8
10
ответ дан 23 November 2019 в 04:41
поделиться

Обычно я помещаю вывод в список, который очень гибкий (вы можете иметь любую комбинацию чисел, строк, векторов, матриц, массивов, списков, объектов в выводе)

примерно так:

func2<-function(input) {
   a<-input+1
   b<-input+2
   output<-list(a,b)
   return(output)
}

output<-func2(5)

for (i in output) {
   print(i)
}

[1] 6
[1] 7
44
ответ дан 23 November 2019 в 04:41
поделиться

I somehow stumbled on this clever hack on the internet ... I'm not sure if it's nasty or beautiful, but it lets you create a "magical" operator that allows you to unpack multiple return values into their own variable. The := function is defined here, and included below for posterity:

':=' <- function(lhs, rhs) {
  frame <- parent.frame()
  lhs <- as.list(substitute(lhs))
  if (length(lhs) > 1)
    lhs <- lhs[-1]
  if (length(lhs) == 1) {
    do.call(`=`, list(lhs[[1]], rhs), envir=frame)
    return(invisible(NULL)) 
  }
  if (is.function(rhs) || is(rhs, 'formula'))
    rhs <- list(rhs)
  if (length(lhs) > length(rhs))
    rhs <- c(rhs, rep(list(NULL), length(lhs) - length(rhs)))
  for (i in 1:length(lhs))
    do.call(`=`, list(lhs[[i]], rhs[[i]]), envir=frame)
  return(invisible(NULL)) 
}

With that in hand, you can do what you're after:

functionReturningTwoValues <- function() {
  return(list(1, matrix(0, 2, 2)))
}
c(a, b) := functionReturningTwoValues()
a
#[1] 1
b
#     [,1] [,2]
# [1,]    0    0
# [2,]    0    0

I don't know how I feel about that. Perhaps you might find it helpful in your interactive workspace. Using it to build (re-)usable libraries (for mass consumption) might not be the best idea, but I guess that's up to you.

... you know what they say about responsibility and power ...

68
ответ дан 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: