Я использую 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
Тогда это работает.В противном случае я получаю сообщение об ошибке
Я перечитываю и делаю все, что могу, чтобы избежать eval
, но на самом деле это кажется более сложным в любом случае