我正在使用DataFrame-js并在React-Material卡中显示CSV。
我添加了一个输入(ace编辑器),以便可以创建Web控制台来针对数据框调用函数。
我正在使用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
,但实际上使用它似乎要复杂得多