Вызов функции из строки в объекте реагирующего состояния - PullRequest
0 голосов
/ 28 февраля 2019

Я использую DataFrame-js и отображаю CSV на карте React-Material.Я добавил вход (редактор ace), чтобы я мог создать веб-консоль для вызова функций на уровне данных.Я использую React.Мой компонент имеет переменную state dataframe, которая содержит фрейм данных.На фрейме данных есть много доступных функций, таких как this.state.dataframe.show() this.state.dataframe.stats.max('column') и т. Д.

Я создал функцию, которая принимает входные данные от пользователя и вызывает их для фрейма данных ... кроме случаев, когдане работаетЯ хочу, чтобы пользователь мог, например, набрать stats.max('column'), и он запускается на фрейме данных:

  ExecuteAgainstDataFrame = evt => {
    //we need to split on the brackets
    const input = evt.getValue().split("(")
    //and pass the content of the brackets as arguments to the function
    const df = this.state.dataframe
    //split the function names on the dot (members)
    const functionNames = input[0].split(".")
    //create a variable that references the function on the dataframe
    let applyToFunction = df
    for (let i = 0, l = functionNames.length; i < l; i++) {
      applyToFunction = applyToFunction[functionNames[i]]
    }
    //process any inputs
    let functionArguments = []
    if (input.length > 1) { //there were some parameters
      //removing the closing bracket and creating an array of the arguments
      functionArguments = input[1].split(")")[0].split(",")
    } else {
      const result = applyToFunction()
      return result
    }
    //call the function, this time with the arguments
    const result = applyToFunction.apply(null, functionArguments)
    return result
  }

Если я сделаю вызов непосредственно на фрейм данных, например,

const input = evt.getValue().split("(")
//and pass the content of the brackets as arguments to the function
const df = this.state.dataframe
df[input[0]]()
return false

Тогда это работает.В противном случае я получаю сообщение об ошибке enter image description here

Я перечитываю и делаю все, что могу, чтобы избежать eval, но на самом деле это кажется более сложным в любом случае

...