splor-mg / checks-planejamento

https://splor-mg.github.io/checks-planejamento
0 stars 0 forks source link

Check de valores únicos sem `NA` em chaves compostas #54

Closed hslinhares closed 2 months ago

hslinhares commented 2 months ago

closes https://github.com/splor-mg/dados-sigplan-planejamento/issues/49#issuecomment-2310154094

fjuniorr commented 2 months ago

@hslinhares tentei mas não consegui descobrir o que está acontecendo na execução no modo interativo vs dentro da função.

Esse uso que você descobriu não está documentado, porque os argumentos da função deveriam ser:

When used in a validation rule: a bare (unquoted) list of variable names. When used directly, a comma-separated list of vectors of equal length.

Então acho que a gente pode assumir que isso não é possível e criar funções dedicadas para cada base (eg. check_composite_primary_key_acoes).

hslinhares commented 2 months ago

@hslinhares tentei mas não consegui descobrir o que está acontecendo na execução no modo interativo vs dentro da função.

Esse uso que você descobriu não está documentado, porque os argumentos da função deveriam ser:

When used in a validation rule: a bare (unquoted) list of variable names. When used directly, a comma-separated list of vectors of equal length.

Então acho que a gente pode assumir que isso não é possível e criar funções dedicadas para cada base (eg. check_composite_primary_key_acoes).

Consegui ler a mensagem de erro e o problema não é no formato da variável col quando chamada pela função, como estavamos achando. Mas sim pq a variável col não está sendo encontrada, quando ela é definida dentro da função. Se definimos ela no ambiente global, como abaixo, a função funciona. Alguma sugestão pra consertar isso?

sigplan = read_datapackage('https://raw.githubusercontent.com/splor-mg/dados-sigplan-planejamento-2024/a950492b20bd810485fcc92e22570386d268e11e/datapackage.json')
programas <- sigplan$programas_planejamento

df <- programas
cols <- names(programas)

check <- function(
  df
){
    rules <- validate::validator(
    is_complete(df[cols])
  )

    report <- validate::confront(df, rules)
    return(report)
}

check(programas)

# output
Rules confronted: 1
   With fails   : 1
   With missings: 0
   Threw warning: 0
   Threw error  : 0
hslinhares commented 2 months ago

Depender de uma variável global que tenha o mesmo nome e conteúdo da variável usada dentro da função é frágil.

Melhor a gente ir pra linha de criar funções dedicadas e usar os nomes fixos das colunas que compõem a chave primária.

@fjuniorr o que acha do código em formato parecido com este? Testei e os resultados foram corretos. Os nomes dos argumentos estão ruins ainda.

test <- function(base, col){
if(col == 'programas'){
    df <- sigplan$programas_planejamento
    rule <- validate::validator(
      is_complete(uo_programa_cod, programa_cod, is_deleted_programa, objetivo_estrategico_cod, diretriz_estrategica_cod, ods_titulo), 
      is_unique(uo_programa_cod, programa_cod, is_deleted_programa, objetivo_estrategico_cod, diretriz_estrategica_cod, ods_titulo)
    )

  } else if (col == 'acoes'){
    df <- sigplan$acoes_planejamento
    rule <- validate::validator(
      is_complete(uo_acao_cod, acao_cod, is_deleted_acao),
      is_unique(uo_acao_cod, acao_cod, is_deleted_acao)
    )

  }else if (col == 'localizadores'){
    df <- sigplan$localizadores_todos_planejamento
    rule <- validate::validator(
      is_complete(uo_acao_cod, acao_cod, is_deleted_acao, localizador_cod),
      is_unique(uo_acao_cod, acao_cod, is_deleted_acao, localizador_cod)
    )

  }else if (col == 'indicadores'){
    df <- sigplan$indicadores_planejamento
    rule <- validate::validator(
      is_complete(programa_cod, is_deleted_programa, indicador, is_deleted_indicador),
      is_unique(programa_cod, is_deleted_programa, indicador, is_deleted_indicador)
    )
  }
report <- validate::confront(df, rule)
return(report) 
 }

test(sigplan, 'programas')
# output
Rules confronted: 2
   With fails   : 1
   With missings: 0
   Threw warning: 0
   Threw error  : 0

test(sigplan, 'acoes')
# output 
Rules confronted: 2
   With fails   : 0
   With missings: 0
   Threw warning: 0
   Threw error  : 0
test(sigplan, 'localizadores')

# output

Rules confronted: 2
   With fails   : 0
   With missings: 0
   Threw warning: 0
   Threw error  : 0

test(sigplan, 'indicadores')
# output
Rules confronted: 2
   With fails   : 0
   With missings: 0
   Threw warning: 0
   Threw error  : 0