Оператор $ недопустим для векторов атома c в data.table внутри функции в R - PullRequest
0 голосов
/ 17 апреля 2020

Я использую функцию:

if(nrow(product$productCC) > 0){

product$productCC$type

claimsInvoice[, CCtype := product$productCC$type]  
claimsInvoice[,  ':=' (CCtype = product$productCC$type)]   

}

, но в обоих случаях я получаю ошибку. Хотя я с помощью ': =' была функциональной формой?

> product$productCC$type
[1] "GENERAL_CAP_PER_YEAR"
> claimsInvoice[, CCtype := product$productCC$type] 
Error in product$productCC : $ operator is invalid for atomic vectors

Как это можно исправить?

РЕДАКТИРОВАТЬ:

Я пытался использовать

type <- product$productCC$type
claimsInvoice[,  ':=' (CCtype = type)] 

вместо

claimsInvoice[, CCtype := product$productCC$type] 

, чтобы избежать проблем с областями видимости, упомянутых @ chinsoon12, но это приводит к другой ошибке:

Warning message:
In `[.data.table`(claimsInvoice, , `:=`(CCtype = type)) :
  Coercing 'character' RHS to 'logical' to match the type of the target column (column 13 named 'CCtype').

1 Ответ

1 голос
/ 17 апреля 2020

Проблема (я думаю) заключается в оценке значений NSE, усугубляемой удобством, которое data.table::[ операции, как правило, предоставляют пользователю. Один из способов обойти это - set, который одновременно проще (без NSE) и в разы быстрее, чем data.table::[ и его := назначение.

claimsInvoice <- data.table(x = 1, product = 2)
product <- list(productCC = list(type = "GENERAL_CAP_PER_YEAR"))

### no surprise
claimsInvoice[, CCtype := product$productCC$type ]
# Error in product$productCC : $ operator is invalid for atomic vectors
### works
set(claimsInvoice, j = "CCtype", value = product$productCC$type)

claimsInvoice
#    x product               CCtype
# 1: 1       2 GENERAL_CAP_PER_YEAR
str(claimsInvoice)
# Classes 'data.table' and 'data.frame':    1 obs. of  3 variables:
#  $ x      : num 1
#  $ product: num 2
#  $ CCtype : chr "GENERAL_CAP_PER_YEAR"
#  - attr(*, ".internal.selfref")=<externalptr> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...