racket: Почему не применяется работа с & ldquo; bitmap & rdquo; функционировать?

Я думаю, это то, что вы ищете

Этот шаг - это просто создание ваших данных.

Me <- c(1,82,98)
You <- c(4,0,2)
They <- c(6,5,5)
Him <- c(3,4,2)
She <- c(233,122,99)
df <- as.data.frame(cbind(Me, You, They, Him, She))

Это то, что вы хотите.

df[, sapply(df, mean) > 60]
0
задан platonicity 14 July 2018 в 02:29
поделиться

3 ответа

Комбинация apply и bitmap не работает вместе, потому что bitmap не является функцией. Обратите внимание, что запись в документации на bitmap говорит «Синтаксис», а не «процедура».

Если f является функцией, тогда (apply f (list a b c)) вычислит (f a b c). Однако bitmap не является функцией, это «специальная форма».

Вы в удаче, потому что bitmap/file - это функция, поэтому вы можете использовать это.

1
ответ дан soegaard 17 August 2018 в 12:03
поделиться

Вы используете это неправильно. Таким образом, за переменной + существует объект процедуры, который можно применить. Они равны:

(+ (* 2 3) 5)              ; ==> 11
(apply + (list (* 2 3) 5)) ; ==> 11
(apply + `(,(* 2 3) 5))    ; ==> 11

В вашем примере вы используете bitmap, и это совсем не процедура, а макрос, и кажется, что он должен получать растровые изображения из пакета ракетки и со строками он ожидает хотя бы косой черты, поскольку изображения должны быть в корне пакета. Вы должны заменить его на bitmap/file , который является процедурой, и вместо этого делает путь к файлу абсолютным или относительным к текущему рабочему каталогу.

В вашем примере (apply `(bitmap/file ,filename), который вы передаете, применяется список как первый аргумент вместо объекта процедуры и последний аргумент с параметрами.

В вашем примере (apply bitmap/file `(filename)) вы применяете bitmap с литеральным списком с символом filename, который не имеет ничего общего с делать с переменной с тем же именем. Вы были так близки, так как я думаю, что вы хотели (apply bitmap/file `(,filename)), что является забавным способом сделать (apply bitmap/file (list filename)). Я не понимаю, почему вы не можете просто сделать это:

(define (get_img filename)
  (let ([img (bitmap/file filename)])
    (image->color-list mask)))
3
ответ дан Sylwester 17 August 2018 в 12:03
поделиться
  • 1
    Я попробовал это. Редактировано OP – paul_graham_for_president 14 July 2018 в 02:19
  • 2
    Фактически, ваше предложение (apply bitmap (list filename)) не совсем сработало – paul_graham_for_president 14 July 2018 в 02:27
  • 3
    @paul_graham_for_president обновил мой ответ. – Sylwester 14 July 2018 в 08:49

Я думаю, что стоит понять, что apply полезно для Racket или других Lisp-1. Почти во всех кодах полезно, когда у вас есть функция и множество аргументов, но вы не знаете, сколько их есть, и вы хотите вызвать функцию с этими аргументами. На практике это означает:

  • «у вас есть функция», поэтому, в частности, вы не пытаетесь оценить какую-либо макрокоманду или что-то еще специальное;
  • 'у вас есть куча аргументов означает, что у вас есть список аргументов.

Если вы знаете, сколько аргументов у вас есть, почти никогда не будет причины использовать apply, если аргументы уже список, и вы не хотите его извлекать: (apply cons l) может быть проще, чем (cons (first l) (second l)).

В частности, если вы пытаетесь вызвать функцию с одним аргументом, который вы знаете, тогда apply определенно не то, что вы хотите. И аналогично, это не то, что вы хотите, если «функция» - это макрос.


В Lisp-2 есть дополнительное использование для apply: вызов функции, которая является значением a переменная. Это необходимо, потому что, как глупый пример, (let ((x (lambda (...) ...))) ... (x ...) ...) не будет работать в Lisp-2. Lisp-2s имеют дополнительную функцию funcall, которая делает то, что делает apply, когда вы знаете количество аргументов: вам не нужно funcall в Lisp-1.


Случаи, когда eval полезны, еще реже. Есть некоторые, но почти все время это, в лучшем случае, путаница и, в худшем случае, страшная проблема безопасности: что делает

(define (terror x) (eval `(list x)))

Do, когда он называется? Ответ: что-нибудь вообще, что язык способен делать : (terror '(launch-the-nukes)), скажем.

1
ответ дан tfb 17 August 2018 в 12:03
поделиться